{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6IynTt-pkkxH"
},
"source": [
"# Preconditioners\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VvsUjH0lvApz"
},
"source": [
"Examples for this lecture are drawn from [here](https://tbetcke.github.io/hpc_lecture_notes/intro.html)\n",
"\n",
"The basic strategy of preconditioning is to modify the original linear system to one that *behaves better*:\n",
"\n",
"- Direct solvers typically don't need *user specified* preconditioning since they are already robust and/or the preconditioner can be integrated. E.g.: Row swapping via the permutation matrix before conducting Gaussian Elimination / LU decomposition to achieve diagonal dominance which is cheap and easy to implement.\n",
"\n",
"- Iterative solvers benefit substantially from preconditioners to achieve efficient convergence and control roundoff errors. Many (if not all) sparse matrix iterative solvers expect preconditioners and are applied *efficiently* during execution. Unfortuantely, **there is no general preconditioning technique that always works well** :-(\n",
"\n",
"Certain preconditioners are effective on a particular type of physics, but even then the nature of the boundaries can torpedo convergence.\n",
"\n",
"Preconditioners are an active field of research and key to solving large linear systems ($n=10^{6+})$. They are also critical to using distributed computing (HPC).\n",
"\n",
"There are a variety of preconditioners, the mathematics of which we won't explore here. Rather, lets explore what to look for in a preconditioner, and how to use them."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LAi7o5bR04c8"
},
"source": [
"Consider the linear system,\n",
"$Ax=b$\n",
"we want to multiply the equation by a matrix $P^{-1}$ to make the system easier to solve. As long as $P^{-1}$ isn't singular, the answer won't be changed.\n",
"\n",
"### Left preconditioning\n",
"\n",
"The most traditional and common preconditioner is:\n",
"\n",
"$P^{-1} A x = P^{-1} b$\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TVFnicvynuti"
},
"source": [
"### Right preconditioning\n",
"\n",
"A varient that is better for some cases\n",
"\n",
"$A P^{-1} y = b$\n",
"\n",
"with,\n",
"\n",
"$P x = y $"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cX4PBYQ7nwjx"
},
"source": [
"### Two sided preconditioning\n",
"\n",
"The combination of left and right:\n",
"\n",
"$Q A P^{-1} y = Q b$\n",
"\n",
"again with,\n",
"\n",
"$P x = y$\n",
"\n",
"this method may be needed to preserve symmetry of $A$ (which we have seen is very useful!). The problem is that in general the product of two symmetric matricies is not symmetric! If we say that $Q^T=P^{-1}$, then $QAP^{-1}$ is symmetric."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VbaLDxaVen4s"
},
"source": [
"Recall that the inverse of a sparse matrix is typically dense, and therefore we don't usually want to store $P^{-1}$ explicitly. It is better to store $P$ and the method by which we would apply $P^{-1}$ to a vector. This is similar to solving a system by LU decomposition, $A=LU$. We don't calculate $A^{-1}$ explicitly, we keep $L$ and $U$ and solve systems sequentially."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3VBdNzam0PiW"
},
"source": [
"### Qualities\n",
"\n",
"The best preconditioner is $P = A$, which makes the system trivial. Failing this, we aim for $P^{-1} \\approx A^{-1}$ *in some sense*. This can be quantified by the *condition number* of the preconditioned matrix, which we aim to make $=1$."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NhmKIl2L6oJd"
},
"source": [
"Preconditioner quality is based on:\n",
"- speed of computation and application of $P^{-1}$\n",
"- memory requirements of storing $P^{-1}$ (if it is stored)\n",
"- degree of *fill-in* (sparsity compared to $A$)\n",
"- parallelizability\n",
"\n",
"Since calculation, storage, and application of $P^{-1}$ is an additional computational expense, the benefit must be *worth it*. Often this translates to the total speed of solution (preconditioning and iteration) but it may also extend to the stability of the computation.\n",
"\n",
"E.g.: In time-dependent nonlinear PDEs, we will be solving linear systems thousands of times. A solver that takes twice as long every time but always converges may be better than one that solves fast but sometimes doesn't converge (which may spoil any progress you've made!)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4Rk7eYRBoqf-"
},
"source": [
"# Examples\n",
"\n",
"Let's discuss some common preconditioners and see their effect **on a particular system**."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HAlrR2sXCuug"
},
"source": [
"## Jacobi"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6_x7Q2ZEKS7g"
},
"source": [
"The Jacobi preconditioner (otherwise called diagonal scaling) is simply the main diagonal of $A$. The inverse is trivially the inverse of the diagonal elements, which means we can store $P^{-1}$ efficiently.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G3mCkBoJiahE"
},
"source": [
"Example: Solve the discrete Poisson equation on the unit square,\n",
"\n",
"$-\\Delta u = 1$ on $\\Omega=[0,1]^2$\n",
"\n",
"with\n",
"\n",
"$u=0$ on $\\partial \\Omega$"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "amOHS2gakRoq"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from scipy.sparse import coo_matrix\n",
"\n",
"def discretise_poisson(N, Q):\n",
" \"\"\"Generate the matrix and rhs associated with the discrete Poisson operator.\"\"\"\n",
"\n",
" nelements = 5 * N**2 - 16 * N + 16\n",
"\n",
" row_ind = np.empty(nelements, dtype=np.float64)\n",
" col_ind = np.empty(nelements, dtype=np.float64)\n",
" data = np.empty(nelements, dtype=np.float64)\n",
"\n",
" f = np.empty(N * N, dtype=np.float64)\n",
"\n",
" count = 0\n",
" for j in range(N):\n",
" for i in range(N):\n",
" if i == 0 or i == N - 1 or j == 0 or j == N - 1:\n",
" row_ind[count] = col_ind[count] = j * N + i\n",
" data[count] = 1\n",
" f[j * N + i] = 0\n",
" count += 1\n",
"\n",
" else:\n",
" row_ind[count : count + 5] = j * N + i\n",
" col_ind[count] = j * N + i\n",
" col_ind[count + 1] = j * N + i + 1\n",
" col_ind[count + 2] = j * N + i - 1\n",
" col_ind[count + 3] = (j + 1) * N + i\n",
" col_ind[count + 4] = (j - 1) * N + i\n",
"\n",
" data[count] = 4 * (N - 1)**2\n",
" data[count + 1 : count + 5] = - (N - 1)**2\n",
" f[j * N + i] = Q\n",
"\n",
" count += 5\n",
"\n",
" return coo_matrix((data, (row_ind, col_ind)), shape=(N**2, N**2)).tocsr(), f"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 435
},
"id": "5rL1s70oXRke",
"outputId": "dceb4952-8c04-4868-dfdd-61837676917c"
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"N = 10 # Mesh size\n",
"A, f = discretise_poisson(N, 1)\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.spy(A, markersize=1)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9v6FrzBtVfqg"
},
"source": [
"Implement a Jacobi preconditioner"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 879
},
"id": "s8iTu7GNE6U_",
"outputId": "a44321c3-0e21-419a-bc62-069f2007d17d"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unconditioned condition number : 1115.4433890393989\n",
"Preconditioned condition number : 32.30864938962053\n",
"[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 -3.46944695e-18\n",
" -1.38777878e-17 -1.38777878e-17 -2.77555756e-17 -2.77555756e-17\n",
" -1.04083409e-17 -1.38777878e-17 -1.73472348e-18 0.00000000e+00\n",
" 0.00000000e+00 -1.73472348e-17 -3.46944695e-17 -3.46944695e-17\n",
" -4.16333634e-17 -4.16333634e-17 -2.77555756e-17 -3.46944695e-17\n",
" -1.04083409e-17 0.00000000e+00 0.00000000e+00 -1.38777878e-17\n",
" -3.46944695e-17 -5.55111512e-17 -5.55111512e-17 -5.55111512e-17\n",
" -4.85722573e-17 -3.46944695e-17 -1.04083409e-17 0.00000000e+00\n",
" 0.00000000e+00 -2.77555756e-17 -4.16333634e-17 -5.55111512e-17\n",
" -5.55111512e-17 -5.55111512e-17 -5.55111512e-17 -4.16333634e-17\n",
" -2.77555756e-17 0.00000000e+00 0.00000000e+00 -2.77555756e-17\n",
" -4.16333634e-17 -5.55111512e-17 -5.55111512e-17 -4.16333634e-17\n",
" -5.55111512e-17 -4.16333634e-17 -2.77555756e-17 0.00000000e+00\n",
" 0.00000000e+00 -1.04083409e-17 -3.46944695e-17 -4.85722573e-17\n",
" -5.55111512e-17 -5.55111512e-17 -4.85722573e-17 -2.77555756e-17\n",
" -1.04083409e-17 0.00000000e+00 0.00000000e+00 -1.04083409e-17\n",
" -2.77555756e-17 -3.46944695e-17 -3.46944695e-17 -3.46944695e-17\n",
" -3.46944695e-17 -2.77555756e-17 -1.04083409e-17 0.00000000e+00\n",
" 0.00000000e+00 -1.73472348e-18 -1.04083409e-17 -1.04083409e-17\n",
" -2.08166817e-17 -2.08166817e-17 -1.04083409e-17 -1.04083409e-17\n",
" -1.73472348e-18 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00\n",
" 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]\n"
]
},
{
"data": {
"image/png": "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uYKPP/4YNTU1UCqVZp8HX3nlFchkMvzf//0fiouLkZ6ejuTkZGRlZcHNza1Lft+FCxegUChMho5/++232LJlC+bPn4+AgABERkZCo9FgxIgRYlEQGBiIr776CnPnzkVVVRWefvppAM0585e//CUyMjLwyCOPYOHChaiursY333yDn376Cb1794YgCPjVr36FPXv2YO7cuYiPj8fXX3+N5557DleuXMHbb79tEuP+/fvxySef4A9/+AO8vLzwzjvv4KGHHkJBQQH8/f0BAKdOncJ9992HwMBAvPjii2hqasLSpUsRHBzc4e//xS9+gQULFuCdd97B888/j/79+wOA+M+bWSIPt6czv/v48eO4//770b17dyxbtgx6vR5//etf283FZGUCkZ374IMPBADC4cOHhfPnzwsuLi7CggULxPVjx44VBg4cKL7PysoSAAi///3vTfbzxz/+UQAgfPvttx1+X2pqqgBAeOqpp8RlBoNBeOCBBwSlUimUlJQIgiAIeXl5AgDB29tbKC4uNtnH+PHjhUGDBgl1dXUm+7j77ruFmJgYcdmSJUsEAMInn3zSKg6DwSAIgiCkp6cLAIT//Oc/4rqGhgZh5MiRgqenp1BVVWUSj7+/v1BeXi5u+9lnnwkAhP/973/isvj4eKF79+5CRUWFuGzXrl0CACEiIsIkDgDC0qVLxfdvvvmmAEDIy8trFXNERISQmpoqvn/66acFAML3338vLquurhZ69eolREZGCnq9XhAEQdizZ48AQOjfv79QX18vbvv3v/9dACCcOnVKXJaammoSozm/e9CgQUJYWJhQXV0tLtu7d2+bv5uInMeNeUYQBKGmpqbVNps2bRIACPv27ROXzZw5U5DL5eLnbmQ8h5t7HuzRo4d4XhcEQdiyZYsAQPj73/8uLrv5PNiesWPHCv369RNKSkqEkpIS4cyZM8KCBQsEAMKkSZPE7QAIcrlcOH36tMnn586dK3Tv3l0oLS01Wf7II48IPj4+4nFat26dAEBYsWJFu8dh+/btAgDh5ZdfNlk/bdo0QSaTCbm5uSbxKJVKk2UnTpwQAAjvvvuuuGzy5MmCWq0W8vPzxWU///yzoFAohJv/E/jm/LR161YBgLBnz542j9vYsWPF95bIw0uXLm0VY2d/96RJkwR3d3fhypUr4rJz584JLi4urfZJ1sdhh+RQoqKi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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.sparse import diags#, LinearOperator\n",
"from scipy.sparse.linalg import gmres\n",
"from numpy.linalg import cond\n",
"\n",
"\n",
"\n",
"Pinv_jacobi = diags(1/A.diagonal(), offsets = 0,format='csr')\n",
"\n",
"print('Unconditioned condition number :', np.linalg.cond(A.todense()))\n",
"print('Preconditioned condition number :', np.linalg.cond(Pinv_jacobi@A.todense()))\n",
"\n",
"\n",
"residuals1 = []\n",
"callback1 = lambda res: residuals1.append(res)\n",
"residuals2 = []\n",
"callback2 = lambda res: residuals2.append(res)\n",
"\n",
"#Solve the system using GMRES with the Jacobi preconditioner\n",
"x_uncond, _ = gmres(A, f, callback=callback1, callback_type='pr_norm')\n",
"\n",
"\n",
"x_cond, _ = gmres(A, f, M = Pinv_jacobi, callback=callback2, callback_type='pr_norm')\n",
"\n",
"print(x_cond-x_uncond)\n",
"\n",
"\n",
"fig = plt.figure(figsize=(10, 4))\n",
"ax1 = fig.add_subplot(121)\n",
"ax1.semilogy(residuals1)\n",
"ax1.set_title('No preconditioning')\n",
"ax1.set_xlabel('iteration count')\n",
"ax1.set_ylabel('relative residual')\n",
"\n",
"ax2 = fig.add_subplot(122)\n",
"ax2.semilogy(residuals2)\n",
"ax2.set_title('Jacobi Preconditioning')\n",
"ax2.set_xlabel('iteration count')\n",
"ax2.set_ylabel('relative residual');"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jVfsFLr9an5h"
},
"source": [
"meh."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "n5LQlWCsk4fJ"
},
"source": [
"##Incomplete LU (ILU)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1cXxdp_1q4WW"
},
"source": [
"For a sparse matrix $A$, the $L$ and $U$ factores are more filled in than than $A$ which increases memory usage.\n",
"\n",
"Instead of $A=LU$, we can look for factors $\\tilde{L}$, $\\tilde{U}$ such that $P=\\tilde{L}\\tilde{U} \\approx A$.\n",
"\n",
"The different approximations characterized by the degree of fill-in compared to the original matrix $A$. ILU(0) preserves the sparsity pattern. A common approach is to match the sparsity of $A^k$ (which becomes more and more dense), forming the $ILU(k)$ approximations.\n",
"\n",
"Obviously solving $\\tilde{L} \\tilde{U} x = b$ won't give us the correct answer, so instead we use $P$ as a preconditioner for an iterative algorithm. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mh-St6H55VS_"
},
"source": [
"Let's see the LU decomposotion"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 893
},
"id": "UNETVNnq5d8n",
"outputId": "76cc9df1-d75d-469b-d16a-fc092281d6e8"
},
"outputs": [
{
"data": {
"image/png": "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acKECWpqagoZc/ToUVVUVKh///7q06ePJk6cqJaWlpAxzc3NKisrU+/evZWXl6dZs2bpxIkTIWM2b96sUaNGyeVy6YorrlBNTU10V5iGiBmAdBJRyLZs2aKKigq98847qq2t1fHjxzV+/Hj985//tMbMmDFDa9eu1erVq7VlyxZ9+umnuu2226zzJ0+eVFlZmY4dO6a3335bK1asUE1NjebPn2+NOXDggMrKyvTd735X27dvV1VVle655x5t3LgxBpecHogZgHSRYYwx0X7xZ599pry8PG3ZskXjxo1TIBDQJZdcopUrV+oHP/iBJGnfvn0aOnSo6uvrde211+q1117Trbfeqk8//VRer1eStGzZMs2ePVufffaZsrOzNXv2bK1fv167dn35eadJkyapvb1dGzZsCGtuwWBQHo9HgUBAbrc72kt0vGjiFE0EASCWIvkZ3q33yAKBgCSpX79+kqTGxkYdP35cJSUl1pghQ4aosLBQ9fX1kqT6+nqNGDHCipgklZaWKhgMavfu3daYM5/j9JjTz9GVjo4OBYPBkAd4ZQYg9UUdss7OTlVVVWns2LEaPny4JMnv9ys7O1u5ubkhY71er/x+vzXmzIidPn/63PnGBINBHTlypMv5VFdXy+PxWI+CgoJoLy3lEDMAqSzqkFVUVGjXrl1atWpVLOcTtblz5yoQCFiPgwcPJntKtkLMAKSqqEJWWVmpdevW6fXXX9dll11mHff5fDp27Jja29tDxre0tMjn81ljzr6L8fSfLzTG7XYrJyenyzm5XC653e6QB0IRMwCpKKKQGWNUWVmpl19+WZs2bVJRUVHI+WuuuUY9e/ZUXV2ddaypqUnNzc0qLi6WJBUXF2vnzp1qbW21xtTW1srtdmvYsGHWmDOf4/SY08+B6BEzAKkmorsWf/rTn2rlypX685//rMGDB1vHPR6P9Upp+vTpevXVV1VTUyO32637779fkvT2229LOnX7/dVXX638/HwtWrRIfr9fkydP1j333KMFCxZIOnX7/fDhw1VRUaG7775bmzZt0gMPPKD169ertLQ0rLly1+L5cTcjADuL5Gd4RCHLyMjo8vhzzz2nn/zkJ5JOfSD6oYce0gsvvKCOjg6VlpZqyZIl1q8NJemvf/2rpk+frs2bN+uiiy7SlClTtHDhQmVlZVljNm/erBkzZmjPnj267LLL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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
":15: SparseEfficiencyWarning: splu converted its input to CSC format\n",
" lu = splu(A)\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA0cAAAGnCAYAAAB8YSwoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABD9ElEQVR4nO3de3RU5b3/8U8uJhBwJgIlIZVLrBWkUFFoMd56zjE/g8Z6rPRCS5Vaq0cbWhGrhlJBtEiKqy3VWqieVlirqNW1eqEEoSyoWCUi0oNykWgXIrQ1oS0mI0UDSfbvD5oxk8xlz8yeefae/X6tlaXM7Jl55slkf+ezn2c/O8+yLEsAAAAA4HP5phsAAAAAAG5AOAIAAAAAEY4AAAAAQBLhCAAAAAAkEY4AAAAAQBLhCAAAAAAkEY4AAAAAQBLhCAAAAAAkEY4AAAAAQBLhCAAAAAAkEY4AV1m5cqXy8vL08ssvm24KAMDn7rnnHuXl5ekf//hH1PsnTJig//iP/8huo4AMIxwBAAAAgAhHAAAAACCJcAQAAAAAkghHAAAAACCJcAQAAAAAkghHAAAAACCJcAQAAIAU5eXlmW4C4CjCEQAAAPoZMGCAJOm9996Lev+xY8fC2wC5gnAEAACAfkaPHi1Jam5u7nffsWPHdOjQofA2QK4gHAEAAKCfSy+9VEVFRVq+fLm6u7sj7nvkkUfU2dmpyy+/3FDrgMwoNN0AAP39/Oc/1/r16/vdfuutt+rUU0810CIAgN8MHz5cCxYs0He+8x1dcskluuqqq1RSUqKtW7fqiSee0GWXXaZPf/rTppsJOCrPsizLdCMAnLRy5Updf/31Me8/dOiQTj/99Cy2CADgd6tXr9aPf/xj7dq1S52dnaqsrNQXv/hF3XXXXSouLjbdPMBRhCMAAAAAEOccAQAAAIAkwhEAAAAASCIcAQAAAIAkwhEAAAAASCIcAQAAAIAkwhEAAAAASCIcAQAAAIAkwhEAAAAASMrRcPTwww9rzJgxGjBggKZOnaqXXnrJdJMctWTJEn3iE5/QqaeequHDh+vqq69Wc3NzxDbvv/++6urqNHToUA0ePFjTp09Xa2trxDYHDx5UbW2tSkpKNHz4cN1xxx3q7OyM2ObZZ5/Veeedp+LiYp155plauXJlpt+eYxoaGpSXl6c5c+aEb/Nzv/z1r3/Vl7/8ZQ0dOlQDBw7UxIkT9fLLL4fvtyxLCxYs0IgRIzRw4EBVV1frjTfeiHiOI0eOaObMmQoEAiotLdUNN9ygo0ePRmzz6quv6uKLL9aAAQM0cuRILV26NCvvLxVdXV26++67VVlZqYEDB+ojH/mI7rvvPvW+NrYf+wWZQW3y9z64B7XpA9Sl6KhNhlk55sknn7SKioqsn//859aePXusG2+80SotLbVaW1tNN80xNTU11mOPPWbt3r3b2rlzp3XFFVdYo0aNso4ePRre5uabb7ZGjhxpbdq0yXr55Zet888/37rgggvC93d2dloTJkywqqurrf/7v/+z1q1bZw0bNsyaN29eeJv9+/dbJSUl1ty5c629e/daDz30kFVQUGCtX78+q+83FS+99JI1ZswY6+Mf/7h16623hm/3a78cOXLEGj16tPWVr3zF2rZtm7V//35rw4YN1p///OfwNg0NDVYwGLR+85vfWK+88op11VVXWZWVldZ7770X3mbatGnWOeecY7344ovWH//4R+vMM8+0vvjFL4bvb29vt8rKyqyZM2dau3fvtp544glr4MCB1k9/+tOsvl+7Fi9ebA0dOtRau3at9eabb1pPP/20NXjwYOtHP/pReBs/9gucR206ya/74B7Upg9Ql2KjNpmVc+Hok5/8pFVXVxf+d1dXl1VRUWEtWbLEYKsy6/Dhw5Yka8uWLZZlWVZbW5t1yimnWE8//XR4m9dee82SZDU1NVmWZVnr1q2z8vPzrZaWlvA2y5cvtwKBgNXR0WFZlmXdeeed1sc+9rGI1/rCF75g1dTUZPotpeXdd9+1PvrRj1obN260PvWpT4ULkJ/75a677rIuuuiimPd3d3db5eXl1gMPPBC+ra2tzSouLraeeOIJy7Isa+/evZYka/v27eFtnnnmGSsvL8/661//almWZf3kJz+xTjvttHBf9bz22LFjnX5LjqitrbW++tWvRtx2zTXXWDNnzrQsy7/9AudRm/y9D7YsalNf1KXYqE1m5dS0uuPHj2vHjh2qrq4O35afn6/q6mo1NTUZbFlmtbe3S5KGDBkiSdqxY4dOnDgR0Q/jxo3TqFGjwv3Q1NSkiRMnqqysLLxNTU2NQqGQ9uzZE96m93P0bOP2vqyrq1NtbW2/tvu5X9asWaMpU6boc5/7nIYPH65zzz1Xjz76aPj+N998Uy0tLRHvKxgMaurUqRF9U1paqilTpoS3qa6uVn5+vrZt2xbe5pJLLlFRUVF4m5qaGjU3N+udd97J9NtM2gUXXKBNmzbp9ddflyS98sorev7553X55ZdL8m+/wFnUJmqTRG3qi7oUG7XJrELTDXDSP/7xD3V1dUXsPCSprKxM+/btM9SqzOru7tacOXN04YUXasKECZKklpYWFRUVqbS0NGLbsrIytbS0hLeJ1k8998XbJhQK6b333tPAgQMz8ZbS8uSTT+pPf/qTtm/f3u8+P/fL/v37tXz5cs2dO1ff/va3tX37dn3zm99UUVGRZs2aFX5v0d5X7/c9fPjwiPsLCws1ZMiQiG0qKyv7PUfPfaeddlpG3l+q6uvrFQqFNG7cOBUUFKirq0uLFy/WzJkzJcm3/QJnUZuoTdSm/qhLsVGbzMqpcORHdXV12r17t55//nnTTTHu0KFDuvXWW7Vx40YNGDDAdHNcpbu7W1OmTNH9998vSTr33HO1e/durVixQrNmzTLcOnOeeuoprV69Wo8//rg+9rGPaefOnZozZ44qKip83S9AuqhNH6A2RUddio3aZFZOTasbNmyYCgoK+q3w0traqvLyckOtypzZs2dr7dq1+sMf/qDTTz89fHt5ebmOHz+utra2iO1790N5eXnUfuq5L942gUDAdUegpJNTEw4fPqzzzjtPhYWFKiws1JYtW/Tggw+qsLBQZWVlvuwXSRoxYoTGjx8fcdvZZ5+tgwcPSvrgvcX72ykvL9fhw4cj7u/s7NSRI0eS6j83ueOOO1RfX68ZM2Zo4sSJuvbaa3XbbbdpyZIlkvzbL3AWtekkahO1qTfqUmzUJrNyKhwVFRVp8uTJ2rRpU/i27u5ubdq0SVVVVQZb5izLsjR79mz9+te/1ubNm/sNiU6ePFmnnHJKRD80Nzfr4MGD4X6oqqrSrl27Iv5wNm7cqEAgEN5ZVVVVRTxHzzZu7ctLL71Uu3bt0s6dO8M/U6ZM0cyZM8P/78d+kaQLL7yw35K6r7/+ukaPHi1JqqysVHl5ecT7CoVC2rZtW0TftLW1aceOHeFtNm/erO7ubk2dOjW8zXPPPacTJ06Et9m4caPGjh3ryuH5Y8eOKT8/cjdYUFCg7u5uSf7tFziL2nQStYna1Bt1KTZqk2GmV4Rw2pNPPmkVFxdbK1eutPbu3WvddNNNVmlpacQKL153yy23WMFg0Hr22Wett99+O/xz7Nix8DY333yzNWrUKGvz5s3Wyy+/bFVVVVlVVVXh+3uWBb3sssusnTt3WuvXr7c+9KEPRV0W9I477rBee+016+GHH3b1sqDR9F4RyLL82y8vvfSSVVhYaC1evNh64403rNWrV1slJSXWL37xi/A2DQ0NVmlpqfXb3/7WevXVV63//u//jros6Lnnnmtt27bNev75562PfvSjEcuCtrW1WWVlZda1115r7d6923ryySetkpIS1y4LOmvWLOvDH/5weLnUX/3qV9awYcOsO++8M7yNH/sFzqM2neTXfXBf1CbqUjzUJrNyLhxZlmU99NBD1qhRo6yioiLrk5/8pPXiiy+abpKjJEX9eeyxx8LbvPfee9bXv/5167TTTrNKSkqsz3zmM9bbb78d8TwHDhywLr/8cmvgwIHWsGHDrNtvv906ceJExDZ/+MMfrEmTJllFRUXWGWecEfEaXtC3APm5X373u99ZEyZMsIqLi61x48ZZjzzySMT93d3d1t13322VlZVZxcXF1qWXXmo1NzdHbPPPf/7T+uIXv2gNHjzYCgQC1vXXX2+9++67Edu88sor1kUXXWQVFxdbH/7wh62GhoaMv7dUhUIh69Zbb7VGjRplDRgwwDrjjDOs+fPnRyxr6sd+QWZQm/y9D+6N2nQSdSk6apNZeZbV63K7AAAAAOBTOXXOEQAAAACkinAEAAAAACIcAQAAAIAkwhEAAAAASCIcAQAAAIAkwhEAAAAASCIcAQAAAICkHA5HHR0duueee9TR0WG6Ka5Cv8RG30RHv8RG3yBZfGaio19io2+io1+io1/S5+qLwD788MN64IEH1NLSonPOOUcPPfSQPvnJT9p6bCgUUjAYVHt7uwKBQIZb6h30S2z0TXT0S2z0jT9Rm5xHv8RG30RHv0RHv6TPtSNHv/zlLzV37lwtXLhQf/rTn3TOOeeopqZGhw8fNt00AIBPUZsAILe5Nhz94Ac/0I033qjrr79e48eP14oVK1RSUqKf//znppsGAPApahMA5LZC0w2I5vjx49qxY4fmzZsXvi0/P1/V1dVqamqK+piOjo6I+ZVtbW2SpPb29oy21WtCoVDEf/EB+iY6+iU2+iY6y7L07rvvqqKiQvn5rj0GlzRqU+bwtxQbfRMd/RId/RKb3drkynD0j3/8Q11dXSorK4u4vaysTPv27Yv6mCVLlmjRokX9bh81alRG2uh1I0eONN0E16JvoqNfYqNvojt06JBOP/10081wDLUp8/hbio2+iY5+iY5+iS1RbXJlOErFvHnzNHfu3PC/29vbNWrUKH34lpXKLy6RJO1eVGOqeQDgG6FQSCNHjtSpp55quinG2alN0VCvYpuwcEPEv88qG6Rfff0iQ60B4FZ99xVnBPO0ZdHnEtYmV4ajYcOGqaCgQK2trRG3t7a2qry8POpjiouLVVxc3O/2/OKScAH6+P1/1IGGWucbDADoJy8vz3QTHJWp2hQNq0zF1rff/txm0V8A+um7r9jffkxS4trkysngRUVFmjx5sjZt2hS+rbu7W5s2bVJVVVVazz2mvjHd5gEAfCiTtQkA4A6uDEeSNHfuXD366KNatWqVXnvtNd1yyy3617/+peuvvz7t5yYgAQBSkcnaBHuYAQLAjlT3Fa6cVidJX/jCF/T3v/9dCxYsUEtLiyZNmqT169f3OxE2VWPqG9nBAgCS4lRt2r2oRh+//48ZaiUAIFV5lmVZphuRCT1XCB4556m487oJSADgLK7QHlvfvok3k2Fc+WBJUnPLUY0tH6z1cz6VrWa6WrQ+o5YD6O2s+et0vCsy4nR3HNOhZZ9PWJtcO60uW5hiBwAwJd6X+n0tR7Wv5aisf/8/pIVrdptuAgAXG1PfqDH1jf2CUTJ8H44kAhIAwBxGPexbtfUt000AkONce86RU3Yvquk3dBYtDHEOEgDAlAMNtRyoSxG1G0AiBxpqT05rXpZ4W1+OHPXM4+6LwgQAMIUv+QBgni/DUTwEJACAKfECUs9cer/y83sHkD2+DEfNCU5sZQcMADAl1RGknvBEDQOA1PkyHI2NMa2uN4oLAMAUptgBgBk5vyBDNNGuFcEiDQAAN4m1SEPPbdQn+gBApL77zVT2Eb4cOUoGI0gAAFPsFnZqFQA4g3D0bwcaamMWIYoOAMCUeLXJz+cYzbpgtOkmAHAZJ/aHhKM+CEgAALdh+lj/Plh01QRDLQGQywhHSSAgAQBMISABQOYRjqJgih0AwI38GpD6Th8sLfHlelIAsoBwlAICEgDAFL8GpN7ajnWabgKAHEU4iiFRACIgAQBMISABQGKpfF8nHPWS7Mo/BCQAgCl+D0jUYACZwKTdNHGhWACAKYkuFNt7uzPqG9Wtk0dF93uobhGCAGQTI0cOYMcNADDF7gG67j7/BQD0RziyKVHxISABAExJdgZDrtQsP18EF0BiqQQdptX1kqi49L4/1jQGptgBAEyINcUu1/jlfQJInhPfwxk5chg7bACAKbl2jT6vthuAdxGOMoCdOQDAlFyfwUCNBZBJhKMMYecNADAl1wMSAGQK4ShFdjqOgAQAMMUvAamoIM90EwDkEMJRiuwuhUpAAgCYEi8g2Vnp7az565K+QHq2He+yTDcBQA4hHKUomY5za0EBAOQ+uyNI0UIQwQOA3xCOUpTs1cUJSAAAU/wyxQ4A0sV1jtKQaLpCtNsoUAAAE2JdH8itB+9itYs6CiCTGDnKMrcWIQBA7iNYAEB8hCMDCEgAAFMISAAQG9PqMqR38WGKHQDATWJNsYu2nZu4rT0Acg/hKEMm3btBbcc6425DQAIAmGInIPW933TNom4CyDSm1WVIomDUgyl2AABTYgUNt9em3suOu72tALyFkaMMKS0pTCogcSQMAGCC11axAwC7eu/HujuO2XoMI0cZsnNBTb/Aky/vHqUDAOQuDtABwEmMHGVYtIIT7ygdBQoAYILdRRqyJd7CRkUFeTreZWW7SQB8gJEjl3FTYQIA+ItXDtARjABkCiNHGZJOyGEECQBgSrwRpLPmr9Pri6/ISjs4WAjABMKRSxGQAACmxApIx7ustJb3tvtYghEAU5hW52IUBwCAKU4foKOmAfACRo4yJJWiwiINAAA3cesiDdRFAHb03leEQiEFlyV+DCNHLsL0AgCA2xBEAPgJ4chFpi3bEvM+AhIAwBQCEgC/IBy5SHPL0bj3E5AAAKbEm90Qqz713Ef9AuAVhCMXGVs+OOE2FBgAgCl2RpAIRAC8jHDkIuvnfMrWdhQcAIApqYwgAYBXsFqdy0QrOqxiBwBwk0yvYjeufLD29ZlqTs0DkA15lmVZphuRCaFQSMFgUO3t7QoEAqabk7ZYRYhiAcBtcm3/66Rc65tkAxI1C4Apdve/TKvzCJb5BgC4TTJhp6ggL4MtAQBnEI48Il4IIiABAEyxG5COd1mclwTA9QhHOYJiAwAwxcnpcqx2B8AkwlEOoZAAAEzhfCIAuYBw5AHJhB4CEgDAFLsBye7IEKNIALKNcJSDKCIAAFMYQQLgZYSjHEVAAgCYQkAC4FWEoxxGQAIAmEJAAuBFhaYbgEhOB5ox9Y0UKACAEQcaah2ra9QzANnAyJEPMIIEADAlXqBJdrGFyfdt1MI1u51oFgBERTjyCQISAMAUp0Z8/vmv41q19S1HngsAokkqHC1ZskSf+MQndOqpp2r48OG6+uqr1dzcHLHN+++/r7q6Og0dOlSDBw/W9OnT1draGrHNwYMHVVtbq5KSEg0fPlx33HGHOjs7I7Z59tlndd5556m4uFhnnnmmVq5cmdo7zEEHGmr7/dhBQAKQi6hN3pBoBOkMahQAF0jqnKMtW7aorq5On/jEJ9TZ2alvf/vbuuyyy7R3714NGjRIknTbbbepsbFRTz/9tILBoGbPnq1rrrlGL7zwgiSpq6tLtbW1Ki8v19atW/X222/ruuuu0ymnnKL7779fkvTmm2+qtrZWN998s1avXq1Nmzbpa1/7mkaMGKGamhqHu8BdUj26Fu1x0cIQc7YB5Bpqk3fEOwepWxzEA2BenmVZVqoP/vvf/67hw4dry5YtuuSSS9Te3q4PfehDevzxx/XZz35WkrRv3z6dffbZampq0vnnn69nnnlGV155pf72t7+prKxMkrRixQrddddd+vvf/66ioiLdddddamxs1O7dH8wrnjFjhtra2rR+/XpbbQuFQgoGg2pvb1cgEEj1LXpavCJDQAKQKab3v9Qm90s3BFHDACTL7v43rXOO2tvbJUlDhgyRJO3YsUMnTpxQdXV1eJtx48Zp1KhRampqkiQ1NTVp4sSJ4eIjSTU1NQqFQtqzZ094m97P0bNNz3NE09HRoVAoFPHjd/Gm3HF0DkCuoja5XzLhhiAEIJtSDkfd3d2aM2eOLrzwQk2YMEGS1NLSoqKiIpWWlkZsW1ZWppaWlvA2vYtPz/0998XbJhQK6b333ovaniVLligYDIZ/Ro4cmepb8w0CEoBcQ23yDkIPADdKORzV1dVp9+7devLJJ51sT8rmzZun9vb28M+hQ4dMN8k1Sktin1pGQAKQS6hN3kJAAuA2KV0Edvbs2Vq7dq2ee+45nX766eHby8vLdfz4cbW1tUUcoWttbVV5eXl4m5deeini+XpWDOq9Td9VhFpbWxUIBDRw4MCobSouLlZxcXEqb8fTnAg3LNIAIBdQm7wp0YViWVwIQDYlNXJkWZZmz56tX//619q8ebMqKysj7p88ebJOOeUUbdq0KXxbc3OzDh48qKqqKklSVVWVdu3apcOHD4e32bhxowKBgMaPHx/epvdz9GzT8xx+1nPBvGQvnGfneQHAi6hN3kfQAeAWSa1W9/Wvf12PP/64fvvb32rs2LHh24PBYPio2S233KJ169Zp5cqVCgQC+sY3viFJ2rp1q6STy6VOmjRJFRUVWrp0qVpaWnTttdfqa1/7WsRyqRMmTFBdXZ2++tWvavPmzfrmN7+pxsZG28ulumlFILurxrkhoFCgAKQr2/tfalPuSLUOUrsARNN7n9LdcUyHln0+4f43qXCUl5cX9fbHHntMX/nKVySdvNDe7bffrieeeEIdHR2qqanRT37yk/C0BEl66623dMstt+jZZ5/VoEGDNGvWLDU0NKiw8INZfs8++6xuu+027d27V6effrruvvvu8GvYke0C5MQO3Q3hSKLIAEhPtve/1KbckkotpG4BiCbj4chLMl2AnAoybgxHEoUGQOoIALHRN/YkWw+pWQCiSSUcpbQggx9lKri4KRD1xsmuAABTEi3SAADROLHfIBz926R7N6jtWKfpZtgSLbRkoogQkAAAphCQAJjg63BkYqdrd2fvlul2BCQAgCkEJADZ5ttwNG3ZFseeqyc8xNqB9w0XyYYNO9tH22byfRv1z38dT+q1oiEgAQBMISAByKacD0cTFm5QfnGJpMQhJlVu3Wlfec4Irdr6VsRtqY5IEZAAAKYQkABkS86Ho97S2bE6HawSPY8TQWTRVRO06KoJCV/D7nsiIAEATCEgAcgGX4Uju+IFgL73+W1HTUACAJgSKyBFu41alZ6+fUp/wo3OqG9Ut8PP6ftwxB978ghIAABTGEEC0MPpYCT5LBxl4pyjVEOCm8JFvLbE6isCEgDAlGQDEqMgySF8ws9yPhztXlTT7yq47BTtixcoCUgAAFMYQQIQTazvpqFQSMFliR+f72xz4DcUJgCAKYlmPlCjAP9J9++ecIS0UXwAAKYwgwFAX+l8NyUcwREEJACAKamcOwsA0RCOYMuBhtqIn2goQAAAUxhBcg59CT8jHMFRBCQAgCl8qQeQLsIRUsIIEgDAjQhIANLZDxCOkJJEqwARkAAAphCQAH9L53tozl/nCM5K9qJ7FCgAgAnxroPUc3usa/n5vXZxgBNekOhz2vfv3C5GjpBR7GABAKb4PeQki2tDAYQjZAE7WgCAKVwoFkAymFaHpNg5Chet0DDFDgBgSrwpdoiP2g0viDVFNhWMHCFrKEwAAFP4kg/AjjzLsizTjciEUCikYDCo9vZ2BQIB083xpVhhiAIF5Db2v7HRN+YlOlA364LRWnTVhCy1xn2o3fCKZBdSsbv/ZeQIWccIEgDAlERfoFZtfStLLQHgRpxzhIyws7wiR6EAACZwDlJ09Am8LtpnmKW8YZzdnSs7YQCAKcmsYtfz71yuW7n83oBkEI5gFDtjAIApqcxgmLZsS8JtvBamvNJOIBsIRzCOnTIAwJRkr4O0r+VoppsEwCDOOYLjEh2J4zpIAAA3yeQ5SF6tb15sM/wl2mfUic8tI0dwDUaQAACmEAYASIQjGHCgoTZmESIgAQBMsROQcjFERXtPXjpnCnAS4Qiuw84YAGBKLoYfAPYRjpB1k+7dYOs6SAAAmJBokYZck4vvCUgV4QhZ13as09Z27KwBAKYku4odAHfovZR+Kn+nhCO4GsUHAGBKKlPsqFuAtxGOkHXJfugoNAAAUxhBAvyF6xwh6/ZzHSQAgIdk8jpIbtBTX/u+R+ou/IiRI3hGLhcmAIC7xQsKk+/bqIVrdmexNc6atmyLKqmxgCQpz7Isy3QjMiEUCikYDKq9vV2BQMB0c5CCWGGII1mAu7H/jY2+8b5UDtS5vW5Rb+EHdve/jBzBcxhBAgCYQmAAchvnHMG1Ys2B7rmNAgUAMCGZc5C8Vqu81l6gt95/l6l+lhk5gusNHVQU9XZGkAAAphAiAHfjOkfIWVeeMyLmfQQkAIApBCQg9zCtDq50Rn2jum1uyxQ7AIApiabYea1GOTEtCfAywhGMiHUthVRHgrxWfAAAuSNXr4NEbYUfMa0OruDEVcZzsTABALwhXog4a/66frdNuneDxtQ3atK9GzLZLABJYuQIOYWjXAAAU2KNIB3vssK350sR08bbjnVmp3ExJDqweEZ9o/ZTV+EjjBwh5zCCBAAwJdEBOrvn07qF19oLpIuRIxjh5OgO10ECALhJrp2DRE2FVzjxOWXkCJ5XVJAX9fZcKkwAAG/xQpigTgL9EY7gea8vviLmfez4AQCmeCEgAYhEOELOIyABAEwhIAHewjlHyAm9iw/nIAEA3MSL5yBRM+FXeZZlWaYbkQmhUEjBYFDt7e0KBAKmm4MMmnTvBttLobKzBzKP/W9s9I2/xQtI2a5PyYY16ie8zu7+l2l18LxkrhHhtSN3AIDcYSdg9FwUnXoFmEE4gueVliQ3O5SCAwAwJVZAIhAB7sA5R/C8nQtq4t7POUgAADdx6zlIPXXRjW0Doun7WeU6R0Aa2PkDAEzhAB3gvGnLtqiyvlHTlm1J+TkIR8h5Bxpq405jAADABDcFJDe1BUjVvpajsv7931SlFY4aGhqUl5enOXPmhG97//33VVdXp6FDh2rw4MGaPn26WltbIx538OBB1dbWqqSkRMOHD9cdd9yhzs7Ik+qfffZZnXfeeSouLtaZZ56plStXptNU+Fy8EERAAnILtQleEi+URFucIVMLNlALgZNSDkfbt2/XT3/6U3384x+PuP22227T7373Oz399NPasmWL/va3v+maa64J39/V1aXa2lodP35cW7du1apVq7Ry5UotWLAgvM2bb76p2tpa/ed//qd27typOXPm6Gtf+5o2bNiQanOBuCgKQG6gNsGL3L6MN+AnKYWjo0ePaubMmXr00Ud12mmnhW9vb2/Xz372M/3gBz/Qf/3Xf2ny5Ml67LHHtHXrVr344ouSpN///vfau3evfvGLX2jSpEm6/PLLdd999+nhhx/W8ePHJUkrVqxQZWWlvv/97+vss8/W7Nmz9dnPflY//OEPHXjLQHQUC8DbqE3wMrvLfAPIrJRWq6urq1Ntba2qq6v13e9+N3z7jh07dOLECVVXV4dvGzdunEaNGqWmpiadf/75ampq0sSJE1VWVhbepqamRrfccov27Nmjc889V01NTRHP0bNN7ykSQDKiFR1WsQNyC7UJXmdqFbu+dY86CK/IxGc16XD05JNP6k9/+pO2b9/e776WlhYVFRWptLQ04vaysjK1tLSEt+ldfHru77kv3jahUEjvvfeeBg4c2O+1Ozo61NHREf53KBRK9q0BkghIgBdRm5ArYgWkTIamnuem9gFJTqs7dOiQbr31Vq1evVoDBgzIVJtSsmTJEgWDwfDPyJEjTTcJHsbUBcA7qE3INYQUwJykwtGOHTt0+PBhnXfeeSosLFRhYaG2bNmiBx98UIWFhSorK9Px48fV1tYW8bjW1laVl5dLksrLy/utENTz70TbBAKBqEfmJGnevHlqb28P/xw6dCiZtwb0Q0ACvIHahFxEQALMSCocXXrppdq1a5d27twZ/pkyZYpmzpwZ/v9TTjlFmzZtCj+mublZBw8eVFVVlSSpqqpKu3bt0uHDh8PbbNy4UYFAQOPHjw9v0/s5erbpeY5oiouLFQgEIn6AeHquf8R1kABvozYhV2UqIBG8gNiSOufo1FNP1YQJEyJuGzRokIYOHRq+/YYbbtDcuXM1ZMgQBQIBfeMb31BVVZXOP/98SdJll12m8ePH69prr9XSpUvV0tKi73znO6qrq1NxcbEk6eabb9aPf/xj3XnnnfrqV7+qzZs366mnnlJjI19U4Ry7wYdzkAB3ozYhl8VbpGFMfaNmXTBai66aEPX+WI8BEFtaF4GN5oc//KGuvPJKTZ8+XZdcconKy8v1q1/9Knx/QUGB1q5dq4KCAlVVVenLX/6yrrvuOt17773hbSorK9XY2KiNGzfqnHPO0fe//3397//+r2pqapxuLmALxQTwNmoTvCzeAbpVW99y7HXG1Ddq2rItjj0f4EV5lmVZphuRCaFQSMFgUO3t7UxjQFSpBB5GkIDE2P/GRt8gHfHqlpPXSaLWIRfZ3f+mdJ0jIBck2vlzHSQAgJvEm2I3bdkW7Ws5GrEtgOQ5Pq0OyBWzLhgd9Xam2AEATIkVenoHIwCpIxwBMSy6agKr2AEAXMfJUaFozzXp3g2OPT/gNYQjIAECEgDAbdINSPEuY9F2rDOt5wa8jHAEpIGABAAwJV5A6lufEv0bwEmEIyBNFBgAgCnxAlKi6XHUL6A/whHgAAoMAMCURNPj4tUo6hcQiescASmIVUxYOhVg/xsPfYNMSjXoULvgB3b3v4wcASlgkQYAgNsQcoD0EY6AFBGQAABuk0xAKi0pJFABfRCOgDQQkAAAbmMn8BxoqNXOBTVZaA3gLYWmGwB40Vnz1+l4V/zT9cbUN3JEDgBgxIGGWtsLMVCrgA8QjgAbUh0JIiABAExJFJB6RNuG2gW/YlodEMNZ89dpTH1j2lPkmGIHADCFkAMkh5Ej+Fq8JbkTTZtL9nUoUAAAE+yOIAHgOkfwgVjTBUwUCgIS/ID9b2z0DUxKp+5Rv+BGfT/TRQV5Ot5lqaggT68vviLiPq5zBMSRboFItUhw5A4AYAoBB7muZ9ZPOrN/mFaHnGMqgPQUnUSvzxQ7AIApTLED4iMcwYi+O+ZYweJAQ62mLduifS1Hs9a2RGK1vfe/CUgAALciIMEPej7jyX7fIhwh65LdITe7KBhFwzLfAACvISAB0XHOEVwh1pLZY+oblYkVQ9wSSihMAABT3FILATdh5AgZkakv/Zk60tW7QGQ7sDCCBAAwhREkeFWmPreEI3iO3YUPsvWa0YJNsm0jIAEATCEgAR8gHMGWeDvNvl/qk9nBZjroxNrh972t979LSwq1c0GN7SAU63WjvU48BCQAgCkEJOAkwhHSlsmdabywkKkdeduxTsef0y4CEgDAFAISQDhChtkdQUk1EGRi5Km0xOyfBQEJAGCKnRkXfbehZiGbMh3gCUfICeke7Yq2Y3diZ59quwhIAABTkq1dZ9Q3an+aNYuwBbcgHMGWnh3VwjW7tWrrWyk/PpPs7MyLCvJ0vCsTi4PHli+pO4XHEZAAAKYkE5BSqXFAKrIx7TPPsqzsflPMklAopGAwqPb2dgUCAdPNARKK9QdPQILXsP+Njb6B19j9MppurWLkCHZE+zxGOwgd7TNkd//LRWABl+PkWACAKSaCCnUPyXB65JJwBHgAhQIAYEqigFRUkJellsDvsvFZIxwBLpGo+BCQAACmxKtRnVk+lxf+lY3PGuEIcAk74YeABAAwJVZA6tbJ+tRTo3r+n5oFp2Vj8Q9WqwM8hlXsAACmOH2h2DPqG1ntDhnT+7Pa3XHM1mMYOQI8iKNxAABT4h2gS7Y+EYzgNowcAS6RbLFhBAkAYIrTI0hAKjLxPYiRI8DDKEwAAFM4QIdcxMgR4AE9BYgRJACAmzCCBDfr/f0oFAopuCzxYwhHgAckKjwEJACAKQQkuFUqCzIQjoAcQUACAJgSKyBFu41aBadk4vPFOUdADuHIHQDAlGS/lFKz4EaEI8CjYhUhig0AwBRGheB1TKsDPCBWsYk3jYECBQAwgXOQkCm9v9vY+YylsiADI0dAjqIwAQBM4QAdvIpwBOQwAhIAwJR407+pT3ArwhGQ4yhAAABTGEGCCT0BPJUgTjgCPM5O4SEgAQBMSTYglZZwSjyclcz3ID59QA7oW3hYpAEA4CZ2F2mgTiEVTn5uGDkCfIQRJACAKQQfeEGeZVmW6UZkQigUUjAYVHt7uwKBgOnmAI46o75R3Wk8ngKFTGL/Gxt9AyS/BDPQw+5nJ9p23R3HdGjZ5xPuf5lWB3iEk6M+TLEDAJjCdZDgZoQjwEWyWSwISAAAUwhIyJR0P1eEI8DHCEgAAFPiBaS+t6dbq3o/X7TnSnS/k68Fd2NBBsDnOHIHADAlG+GBOodkEI4AFznQUBv+cUJpSaGt56NwAABMMT26Qg1Eb0yrA1zK6WLR+/m4DhIAwE04Bwl2pPM9JRQKKbgs8XaMHAEIozABAEyJ98V3TH1j+CcZ1DUki3AEIAKFBABgihOLIaQSooAehCMA/VBUAACmMMUbJnHOEeBDfQsP5yABANwkm+cgZfIcX3hP0iNHf/3rX/XlL39ZQ4cO1cCBAzVx4kS9/PLL4fsty9KCBQs0YsQIDRw4UNXV1XrjjTcinuPIkSOaOXOmAoGASktLdcMNN+jo0aMR27z66qu6+OKLNWDAAI0cOVJLly5N8S0CSBUjSPAKahOQe2KFDLvXRgJSkVQ4euedd3ThhRfqlFNO0TPPPKO9e/fq+9//vk477bTwNkuXLtWDDz6oFStWaNu2bRo0aJBqamr0/vvvh7eZOXOm9uzZo40bN2rt2rV67rnndNNNN4XvD4VCuuyyyzR69Gjt2LFDDzzwgO655x498sgjDrxlAMmg2MDtqE1A7ooXkDi/CJmQZ1mWZXfj+vp6vfDCC/rjH/8Y9X7LslRRUaHbb79d3/rWtyRJ7e3tKisr08qVKzVjxgy99tprGj9+vLZv364pU6ZIktavX68rrrhCf/nLX1RRUaHly5dr/vz5amlpUVFRUfi1f/Ob32jfvn222hoKhRQMBtXe3q5AIGD3LQK+ZKewME0AdmV7/0ttAnJfojpVVJCn412RX2ljTc2jnvmT3f1vUiNHa9as0ZQpU/S5z31Ow4cP17nnnqtHH300fP+bb76plpYWVVdXh28LBoOaOnWqmpqaJElNTU0qLS0NFx9Jqq6uVn5+vrZt2xbe5pJLLgkXH0mqqalRc3Oz3nnnnaht6+joUCgUivgBYE/vi88mO40BMI3aBOS+RIGmbzBK9XmApMLR/v37tXz5cn30ox/Vhg0bdMstt+ib3/ymVq1aJUlqaWmRJJWVlUU8rqysLHxfS0uLhg8fHnF/YWGhhgwZErFNtOfo/Rp9LVmyRMFgMPwzcuTIZN4agF4ISPASahPgD6kEGzsH/4DekgpH3d3dOu+883T//ffr3HPP1U033aQbb7xRK1asyFT7bJs3b57a29vDP4cOHTLdJCAnEZDgNtQmwD8IOP61cM3urJxnllQ4GjFihMaPHx9x29lnn62DBw9KksrLyyVJra2tEdu0traG7ysvL9fhw4cj7u/s7NSRI0citon2HL1fo6/i4mIFAoGIHwCZQUCCm1CbAH8hIPnTqq1vZeV1kgpHF154oZqbmyNue/311zV69GhJUmVlpcrLy7Vp06bw/aFQSNu2bVNVVZUkqaqqSm1tbdqxY0d4m82bN6u7u1tTp04Nb/Pcc8/pxIkT4W02btyosWPHRqw+BMAcAhLcgtoE+E8yAYlV7ZCMpMLRbbfdphdffFH333+//vznP+vxxx/XI488orq6OklSXl6e5syZo+9+97tas2aNdu3apeuuu04VFRW6+uqrJZ08mjdt2jTdeOONeumll/TCCy9o9uzZmjFjhioqKiRJX/rSl1RUVKQbbrhBe/bs0S9/+Uv96Ec/0ty5c5199wCisltAKDRwA2oT4E92AhJ1CslKailvSVq7dq3mzZunN954Q5WVlZo7d65uvPHG8P2WZWnhwoV65JFH1NbWposuukg/+clPdNZZZ4W3OXLkiGbPnq3f/e53ys/P1/Tp0/Xggw9q8ODB4W1effVV1dXVafv27Ro2bJi+8Y1v6K677rLdTpZLBeybdO8GtR3rTPnxTHFAbyb2v9QmwL9iBSCW8s4tfX+Xyf4e7e5/kw5HXkEBAuxz4sgaxQY92P/GRt8AmZFMHct0vUr3Szz6cyLkZuQ6RwByU2lJYdrPwdQFAIApBBA4Jf1vRAA8b+eCmqQfE20q3pj6RgoUAMCIWNPokHsy+V2DcAQg5jlH+ZL2x9gBxTpHiYAEADCFgOQPmfyuQTgCfMpO8ei2uV205yYgAQBMSDYgnTV/nY53fXAKPvXL3zjnCPChbBxV48gdAMCUZAJO72AEMHIEIGMYQQIAmBJrBImDd/7R+3fd3XHM1mMYOQKQURQhAIApHKBDsghHACIcaKgN/xQV5DnynAQkAIApBCTvc+KSI3ZxEVgAjot3tXLkPva/sdE3gDl2D9RRq3JH32l1h5Z9novAAnAPRpAAAKZkI/SMqW+M+IH3EI4AZBXFAgBgCqNCSIRwBCDrCEgAAFMISIiHpbwBH0sUUvIl7Y9RRHo/9kBDraYt26J9LUeTem0KFADAhGQvFJsqap0zov2uMtWvhCPAh+wWhO4knrM5iWDUux0UDQCACcleBylRvWJWRG5gWh2AmJLZQYwtH5zSa1BMAACmcIAOfTFyBCCC3ULRd7v1cz4Vc9g7UQBiBAkAYEq2ptjBG7jOEYCs4zpIuY39b2z0DeBeiQJSstPqqGnOS7WPx9Q3cp0jAN7DkTsAgCmEGUiEIwAuQ0ACAJgSLyBxgVd/IBwBcB2KDgDAlFRGkKhbuYNwBMCVKDQAAFOcmGLHCJM3sVodgKyLVnRiXWuCOeAAABNYxc59Uv1OcKCh9uSCOMsSb0s4AuBqBCQAgCnxAhLBKXt69/WBhlpNW7ZF+/598flx5YO1fs6nHHstptUBcD0KEADAFA7QucuY+sZwMJIU8f9OIBwB8AQCEgDAFAKSfxCOALjCgYbaiJ9oCEgAAFMISP5AOALgKQQkAIApBKTcRzgC4EqlJbHXiyEgAQBMISDlNlarA+AayYQeVrEDAJjCMt+5i3AEIOucKigEJACAKQQk7xhT36jujmO2tiUcAci4TBYPAhIAwBQCkrul8rshHAE+FG9nkWzQSLTjyUZwISABAEwhIOUWwhGAlPS+OrUbEJAAAKbEC0h9b7d7uQpqmhmsVgcgJc0uCkY9OHIHADAlF8PMmPrGiB8/YOQI8CEnduBjywfbHjnq/XqJjoylu/NlBAkAYApT7MxwctSNcAQgJevnfCqlxyXaYTlxzhMBCQBgCgHJefFqut3zqEOhkILLEr8W0+oA5CQKEwDAFA7QeRfhCEDOIiABAEyJt/CC387jyZRM9B/hCEBOo/AAAExhBMl7CEcAch4BCQBgip2AdNb8dVloiX8sXLM75ceyIAMAT4tWdFikAQDgJokWaTjeZWWxNfZ5rW4OHVSkf/7ruNa+8rYWXTUhpedg5AiAbzCCBAAwxe7FX92m9/lR6YzIZMOV54zQ0EFFuvKcESk/B+EIgK+4vQgBAHKX10Zi+lq19S3TTYhr0VUTtOPu/5fyqJFEOALgQwQkAIApXg9IuY5zjgDknL6Fh3OQAABuwoVinZGJOk44AuBp6RQXAhIAwBQvBKQzXN6+aP2XL2l/GrWdcATA1whIAABT4gWk3reXlhRq54KabDUrrDvrr5hYokDZrfRqO+ccAfA9tx+5AwDkLjtf4tuOdWahJe7Se5W8bNZpwhEAiIAEADDHjTMYpi3bYroJRjCtDoCnpVpQWKQBAOAmbjsHaV/L0X63ua1G9m6PU33HyBEA9OKmwgQA8Jd44cPEFDM/IhwBQB8UHgCAKW4bnXGLbNVmwhEAREFAAgCYYjog+bkGcs4RAF/iQrEAADdz2zlI2a6Hsd5/rHY41T5GjgAgDjcVJgCAv8T6wu/U+Uecx9Qf4QgAEqBoAABMydaITU+t83vNIxwBgA1+LxYAAHPsrmK3cM1u289JXYuOc44AQJyDBABwNzvnIK3a+pYWXTUhI69tgonXZeQIAJLAkTYAgCl+PEB3xr9Hxc5w41LeXV1duvvuu1VZWamBAwfqIx/5iO677z5ZlhXexrIsLViwQCNGjNDAgQNVXV2tN954I+J5jhw5opkzZyoQCKi0tFQ33HCDjh6NvArvq6++qosvvlgDBgzQyJEjtXTp0jTeJgAk50BDbdwTYeEe1CYAfpLpgBSv/pnQ3eu/2ai/SYWj733ve1q+fLl+/OMf67XXXtP3vvc9LV26VA899FB4m6VLl+rBBx/UihUrtG3bNg0aNEg1NTV6//33w9vMnDlTe/bs0caNG7V27Vo999xzuummm8L3h0IhXXbZZRo9erR27NihBx54QPfcc48eeeQRB94yAKSPgOQe1CYAfpPoHKRE4m0TbfU6P61ql2f1PrSWwJVXXqmysjL97Gc/C982ffp0DRw4UL/4xS9kWZYqKip0++2361vf+pYkqb29XWVlZVq5cqVmzJih1157TePHj9f27ds1ZcoUSdL69et1xRVX6C9/+YsqKiq0fPlyzZ8/Xy0tLSoqKpIk1dfX6ze/+Y327dtnq62hUEjBYFDt7e0KBAK2OwQAektUCNx0dM0tsr3/pTYB8KtYNWrWBaP7nXt01vx1Ot5lqaggT8e7on/9t3NeU7brXt/2pPr6dve/SY0cXXDBBdq0aZNef/11SdIrr7yi559/Xpdffrkk6c0331RLS4uqq6vDjwkGg5o6daqampokSU1NTSotLQ0XH0mqrq5Wfn6+tm3bFt7mkksuCRcfSaqpqVFzc7PeeeedZJoMABnlh6NobkdtAuBXsYLCqq1v9Vu9ricQxQpGOCmp1erq6+sVCoU0btw4FRQUqKurS4sXL9bMmTMlSS0tLZKksrKyiMeVlZWF72tpadHw4cMjG1FYqCFDhkRsU1lZ2e85eu477bTT+rWto6NDHR0d4X+HQqFk3hoARMUqdu5HbQLgZ/FGe1ZtfUurtr5l6zlSef5syHZ9TSocPfXUU1q9erUef/xxfexjH9POnTs1Z84cVVRUaNasWZlqoy1LlizRokWLjLYBQO470FCrhWt29ys2BCRzqE0A/C7dADPp3g3auaAm/FzRnt8vkppWd8cdd6i+vl4zZszQxIkTde211+q2227TkiVLJEnl5eWSpNbW1ojHtba2hu8rLy/X4cOHI+7v7OzUkSNHIraJ9hy9X6OvefPmqb29Pfxz6NChZN4aANgW6xoSTLEzg9oEAOkFmLZjnQ62xNuSCkfHjh1Tfn7kQwoKCtTdfXKRvcrKSpWXl2vTpk3h+0OhkLZt26aqqipJUlVVldra2rRjx47wNps3b1Z3d7emTp0a3ua5557TiRMnwtts3LhRY8eOjTptQZKKi4sVCAQifgAgE+JdgZyAlH3UJgA4KVMjPJPu3aAx9Y2adO+GjDy/myQVjj796U9r8eLFamxs1IEDB/TrX/9aP/jBD/SZz3xGkpSXl6c5c+bou9/9rtasWaNdu3bpuuuuU0VFha6++mpJ0tlnn61p06bpxhtv1EsvvaQXXnhBs2fP1owZM1RRUSFJ+tKXvqSioiLdcMMN2rNnj375y1/qRz/6kebOnevsuweAFKx95e249xOQsovaBAAfyERA6hlZ8sMIU1LnHD300EO6++679fWvf12HDx9WRUWF/ud//kcLFiwIb3PnnXfqX//6l2666Sa1tbXpoosu0vr16zVgwIDwNqtXr9bs2bN16aWXKj8/X9OnT9eDDz4Yvj8YDOr3v/+96urqNHnyZA0bNkwLFiyIuN4EAJhy5TkjEp7gyjlI2UNtAoBIphdR8LKkrnPkJVxLAkCmTFu2Rftajtra1o8Bif1vbPQNgGxKJiDZvbCsV+taRq5zBACQmm0GI4kpdgAAc7waZEwiHAFAksaWD05qewISAMAUAlJyCEcAkCS7U+p6IyABAExJJiCNqW+M+PGbpBZkAAC/cbIwsEgDAMCURIs0xKpRpgNS39fPdB1l5AgAosjUETPTRQYA4F8coEuMcAQAWUZAAgCYYndVOr8iHAGAARQgAIApjCDFxjlHAJAiu8UlVhDiHCQAgClcKDY6LgILAFkSqwjlWkBi/xsbfQPAbZINSF6tWVwEFgA8giN3AABTvBp2MoVpdQAQQ7TlQ5NdUtRu8GGKHQDAFDdPscv2Ut6EIwD4t0SFIdr9k+7doLZjnY69PgEJAGCCGwOSifYQjgD4lhM7XaeCUQ8CEgDAFDcFpHiLGfXoXS+dGmEiHAHwvHg78kzu6A801Do6ctSDgAQAMMVNASmRTLSTBRkAIIEDDbXhn97G1Ddq54IaHWio1awLRjv6ml4pTACA3OPnA3SMHAFAHEMHFdnabtXWtxx/bUaQAACmxBpByvXLUhCOAHhe3x3ywjW7tfaVt3XlOSMkSUUFeTreldol3XqewxQCEgDAFFNT7EzOniAcAcg5i66aoEVXTQj/+/XFV2jasi3a13LU1uPjhRGngkoy5ysRkAAApnjpHCQn5FmWldrhVJfjKuQAvMrrUxbY/8ZG3wDwqkQByckalWwYs/Padve/LMgAAB7hpyN3AAB38coBunQRjgDAQwhIAABT4gWkMfWN4Z9Yzpq/TmPqG3XW/HWZaJ4jCEcA4DEEJACAKXZGkGIFpZ7FkVJdJCkbCEcA4EEEJACAKbk8xY7V6gDAZaIVnVjXmsjlAgUAcK9MrmJ3oKFW05ZtUXPLUfUeYxo6qEg77v5/GXnNHowcAYCHMYIEADAlkwfo9vUJRlJ2rj1IOAIAjyMgAQBMSTUgpVK7el/DMFMIRwCQAwhIAABTcmmKN+EIAHIEAQkAYEqsgGRnie9ojzGFcAQAOYSABAAwJRdGkFitDgA8INGF9/r+OxcKFADAe+yuYhdvpMnOdpnCyBEA5CBGkAAApjgZaLJdzwhHAJCjCEgAAFO8OoOBcAQAHrNwzW7bJ7gSkAAApiQzJTyeZBd0SAfnHAGAB6RTFDgHCQBgSrxzkNx4AI+RIwDwATcWIACAP3jpAB3hCAB8goAEADDFiYCUjel1eZZlWRl9BUNCoZCCwaDa29sVCARMNwcAsi5WAcn0ETz2v7HRNwD8Ltlw01Oz0l3i2+7+l5EjAPAZRpAAAKa4fYod4QgAfIiABAAwJdmAlM2aRTgCAJ8iIAEATLEbkLgILAAgawhIAABT3DjFjnAEADnE7sVh+z4GAAAT3BaQuAgsALjQtGVbtK/laNT7+hYSJ8INF4oFAJgS70KxsfRsP658sNbP+ZRjbWHkCABcKFYw6pHKCFEijCABAExJ9QBdonqZLEaOAPiWnTCQL2l/hkdUkg0lC9fszlBLGEECAJiTygiSFL2OplrLCEcAEEf3v/8bbZpbOivtHGio1aR7N6jtWGfSbVq19a2kH9PT1rHfeUYdnd1xtyUgAQBMSTUgOYVwBMCVUtkxZuoLfaZ20qkEo3QlCkY9CEgAAFOcCki9n6O745itxxCOAIT13RHFm1Jmd6eVaPEAk1/Ae17bD+fapDpNgYAEADDB1AgS4QjwgFSDiJ3niPeY3mMMmdpBOTlPOFXxXi/eqnHpKirI0/Euy7Hn6/0+nPp9EZAAAKakE5BSfRzhCHAJN45emFzOMtNHjOI9d+8w4MTyoLHCxeuLr7DVHrvP13cbAhIAwOuyPYJEOAIQluoX4EzsuCbdu8HR50N6CEgAAFOyGZAIR3BctA9vviKnaPXw85etTPyRZ3LHkeh3Zfd3afcCpiYWK/CqbBUMAhIAwJRsBSTCEWw5o74xarixK53HOimV824y9ZqpshsuvCITO7tEU+bctChE7zZ44XdJQAIAmJKNWmnylAJ4iFvCDfyjtCT5Yzdj6hs9ETC8jj4GAJiS6QN0jBwho/y0VLKTnPzD98LvINr73bmgJqnnsPv+3NwP0dhdfCFdyfYLI0gAAFMyOYJEOEJWJPsl6qz56yKWOI72+IVrdmvV1reSep1Y5z65jd2V1ACTCEgAAFMyFZB8G47sfvm00+kmvxykc/2bvgEkE3raF2v0Ilbf9W2XUx/+/QbO6zAdyLw2UmKC3c9lou2SXY47mWsoRTsYEO05Y7Ul2ntK91zCntchIAEATMhEQPJtOErED18oUwlG2Ziilem+j/dFbtK9G6Kukpbql79sfI7sfpHHSW5a+KA5iYvLrn3lbcdf36nQTkACAJjidF0nHEXhli9OmVZUkJfyyFG0x7rpS2eq3LJ8NF80k9e3z6KNihQV5GWvQTaMLR9se+ToynNGJBw5SpaTo5oEJACAKU5+B/VlODpr/jrTTXCM3S8jToeW1xdfEfX2TAWkbE1NKy0pjBuQor23aL8Dr4fEXLA/zt9GOhe7Tef+vtbP+ZTtbRddNUGLrppge3s7bYnXR6l8hglIAABTnPoOmvPhaMLCDcovLjHdjKjizffnC0ak/Q5O54t2nkdPfye7Qlo2RTuHxI3X64G/jalv1Kvfvth0MwAAPuREQMr5cJSKbH3B9MKqaamI13/pLkucaGTHjmTO80Bqkl2YwKnXIBymz4kDEBMWbnCgJQAAJC/dgOT7cJStL1PZWBkunnjv00tTwJwY2UnmPI++7H5eem/nxIpgqfDKOWCphBwvvC8AAGBGOt+BcjYcWdbJIHJGME/724/F3C4UCsW879x7f68TCQJNvqRXF/X/wp7ukdN47XJad0fs/ukrm+3KlKe+em6/2zL5vnamMMUoWnv6/p5CoVDU23rrPb0p1mdy1G1Px2xHrM933+fbvahG1/zkeb3e+q+Yz5WMRL+PWJ/ZXPh8Os3EKE7P76dnP4wP9PQJn1UAyKxXv31xRA20W5vyrBytXvv379dHPvIR080AAN86dOiQTj/9dNPNcBVqEwCYlag25ezI0ZAhQyRJBw8eVDAYNNwa9wiFQho5cqQOHTqkQCBgujmuQt9ER7/ERt9EZ1mW3n33XVVUVJhuiutQm6Ljbyk2+iY6+iU6+iU2u7UpZ8NRfn6+JCkYDPLhiCIQCNAvMdA30dEvsdE3/fHFPzpqU3z8LcVG30RHv0RHv0RnpzblZ6EdAAAAAOB6hCMAAAAAUA6Ho+LiYi1cuFDFxcWmm+Iq9Ets9E109Ets9A2SxWcmOvolNvomOvolOvolfTm7Wh0AAAAAJCNnR44AAAAAIBmEIwAAAAAQ4QgAAAAAJBGOAAAAAEAS4QgAAAAAJBGOAAAAAEAS4QgAAAAAJBGOAAAAAECS9P8B9wcnK1mHzDwAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# prompt: Find the LU factors of A, and make spy plots of both side by side\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from scipy.sparse.linalg import splu, spilu, gmres\n",
"\n",
"N = 100 #Mesh size\n",
"A, f = discretise_poisson(N, 1)\n",
"\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.spy(A, markersize=1)\n",
"plt.show()\n",
"\n",
"\n",
"lu = splu(A)\n",
"L = lu.L\n",
"U = lu.U\n",
"\n",
"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))\n",
"ax1.spy(L, markersize=1)\n",
"ax1.set_title('L')\n",
"ax2.spy(U, markersize=1)\n",
"ax2.set_title('U')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AUm_3aoywdjq"
},
"source": [
"Perform sparse ilu and apply to the system.\n",
"\n",
"**NOTE** The precoditioner is passed as an operator. Rather than passing $P^{-1}$ we are passing a function that solve $P x = y$. This way we avoid storing a dense matrix!"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 445
},
"id": "M6G4rLgOBADR",
"outputId": "c35f20d7-b4b7-49fb-fda5-a1b0d93df9d4"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
":3: SparseEfficiencyWarning: spilu converted its input to CSC format\n",
" ilu = spilu(A, fill_factor=20, drop_rule='dynamic')\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from scipy.sparse.linalg import spilu, LinearOperator\n",
"ilu = spilu(A, fill_factor=20, drop_rule='dynamic')\n",
"\n",
"M = LinearOperator(matvec=ilu.solve, shape=(N**2, N**2), dtype=np.float64)\n",
"\n",
"residuals1 = []\n",
"callback1 = lambda res: residuals1.append(res)\n",
"x, _ = gmres(A, f, callback=callback1, callback_type='pr_norm')\n",
"\n",
"\n",
"residuals2 = []\n",
"callback2 = lambda res: residuals2.append(res)\n",
"x, _ = gmres(A, f, M=M, callback=callback2, callback_type='pr_norm')\n",
"\n",
"fig = plt.figure(figsize=(10, 4))\n",
"ax1 = fig.add_subplot(121)\n",
"ax1.semilogy(residuals1)\n",
"ax1.set_title('No preconditioning')\n",
"ax1.set_xlabel('iteration count')\n",
"ax1.set_ylabel('relative residual')\n",
"\n",
"ax2 = fig.add_subplot(122)\n",
"ax2.semilogy(residuals2)\n",
"ax2.set_title('ILU Preconditioning')\n",
"ax2.set_xlabel('iteration count')\n",
"ax2.set_ylabel('relative residual');"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 472
},
"id": "wb4geI4D1Y9p",
"outputId": "e3fa845a-acb2-490b-f7c7-a6e272f0a00d"
},
"outputs": [
{
"data": {
"image/png": "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v35YunQprrjiCuzYsQNTpkwxjrto0SJ89tln+M53voNQKIR77rkHF110ET744ANkZ2f7nv9nn32G7du3W9u7d+8e/1L/1re+hV//+tf4xje+geHDh+PZZ5/FyJEjW3yNE/HQQw/h2GOPxfnnn4+srCw88cQTuOaaaxCLxTBp0iQAwJw5c3DttdeiS5cu+MEPfgAAKCws9GyzJfftHqLRKMrLy1FSUoIf//jHeOaZZ3DvvffiyCOPxNVXX53UuRECAFBkv+Ppp59WkUhERSIRVVpaqm688Ub11FNPqYaGBqPea6+9pgCob33rW8b2//u//1MA1LPPPhvfNmLECDVixIj4+qOPPqoAqA8//NDY97nnnlMA1HPPPRffNnLkSNWnTx+rnx9++KECoB599NH4tuLiYtWzZ0/173//O77t9ddfV+FwWI0bNy6+bebMmQqAuvLKK402L7zwQtW9e3evS6OUUqqhoUH17NlTDRo0SH355Zfx7U8++aQCoGbMmGGd5yuvvOJsUymlfvSjHyW8JkopBUDl5OSo9957zzgvAOrBBx+Mb5s4caI65JBD1Pbt2439x4wZowoKCtQXX3zh7EOfPn3UWWedpbZt26a2bdumXn/9dTVmzBgFQF177bVKKaUqKipUTk6Oev/99+P7ffLJJ6pr167q//2//xffJj/LV199VQFQS5cu9Tz+fffdpwCobdu2edaZM2eOAqB+/etfx7c1NDSo0tJS1aVLF1VXV6eU2nt/dO/eXf3nP/+J133ssccUAPXEE084r8We/nstn376qVJq73NwzTXXGPt/4xvfUADUzJkz49vGjx+f8F7ecz/qJPqsysvL1RFHHGFsO/bYY41nS/Z/z/UPct+OHz9eAVC33nqr0eYJJ5yghgwZYh2LkNZAE8N+yNe+9jWsWbMG559/Pl5//XXcc889KC8vx6GHHorHH388Xm/58uUAgMrKSmP/PQK3P//5z/uu0wA+/fRTvPbaa7jiiitw0EEHxbcfd9xx+NrXvhbvr460qZ922mn497//jbq6Os/jrFu3Dlu3bsU111xj2HhHjhyJAQMGtNl5l5WVGTMQxx13HPLz8/HBBx8AaBZt/uEPf8B5550HpRS2b98eX8rLy7Fz505s2LDB9zhPP/00Dj74YBx88ME4/vjjsXTpUlx++eW4++67EY1G8fTTT6OiogJHHHFEfJ9DDjkE3/jGN/Diiy96XruCggIAwFNPPeVpxtnzC/axxx5DLBZLWGf58uUoKirC2LFj49uys7Nx3XXX4fPPP8fzzz9v1B89ejQOPPDA+Pppp50GAPHr5seMGTOwcuVKa9lzj+25r6677jpjv9bM1uh06tQp/vfOnTuxfft2jBgxAh988IFhkmkprblvEz0fLb1uhPjBAcJ+yrBhw/DHP/4R//3vf7F27VpMmzYNn332GS655BL84x//AAB89NFHCIfDOOqoo4x9i4qK0K1bN3z00Uf7tM97jnf00UdbZQMHDsT27duxa9cuY/vhhx9urO/5Ivnvf//bquMMGDCgzc5b9hVo7u+evm7btg07duzAggUL4l/we5YJEyYAaJnItKSkBCtXrsQzzzyD1atXY/v27fjlL3+JTp06Ydu2bfjiiy88r3EsFsOWLVsSttuvXz9UVlbiZz/7GXr06IHy8nLMmzfP+LIbPXo0TjnlFHzrW99CYWEhxowZg9/97nfGYOGjjz5C//79LWX+wIED4+Wu69aSz1hn8ODBKCsrs5acnJz48cLhsGU+SnSNgvC3v/0NZWVlcS3NwQcfHNditGaAEPS+zcvLM0xcgHm/EZIs1CDs5+Tk5GDYsGEYNmwYvvKVr2DChAlYunQpZs6cGa8jxVUtwWuffS2A8nKPVBnonevX1z1fot/85jfj4kjJcccd53ucHj16+LpktpZ7770XV1xxBR577DE8/fTTuO6661BVVYWXXnoJhx12GDp16oQXXngBzz33HP785z9jxYoVWLJkCb761a/i6aefbpU7ayZ9xi29799//32ceeaZGDBgAGbPno3evXsjJycHy5cvx3333ec5u5JKMtV1mLQfOEBoRwwdOhRA81Q+0CxmjMViePfdd+O/3oBmodyOHTucPuJ7fsXJoECJfn23dACy53ibNm2yyt5++2306NHDM0hREPTjfPWrXzXKNm3a1Grf+NYMtHT2KOij0WibfcEffPDBOOCAAzyvcTgcRu/evZ1tDB48GIMHD8bNN9+M1atX45RTTsH8+fNx++23A2h2zzvzzDNx5plnYvbs2bjzzjvxgx/8AM899xzKysrQp08fvPHGG4jFYsYswttvvw0A+zw2wZ7n4P333zd+nSe6RgceeGDCQFjyvn/iiSdQX1+Pxx9/3JgBee6556x9W/N8pPK+JaS10MSwH/Lcc88l/HW1x9a65yX49a9/HQCsKIezZ88GAKeKe8907AsvvBDfFo1GsWDBAqtu586dWzSlesghh6C4uBgLFy40XsIbN27E008/He9vsgwdOhQ9e/bE/PnzDXfOv/zlL3jrrbdarV7fM3hpbSTFSCSCiy++GH/4wx+wceNGq3zbtm2talce46yzzsJjjz1muGDW1tZi0aJFOPXUU5Gfn59w37q6OjQ1NRnbBg8ejHA4HL+O//nPf6z9iouLASBe5+tf/zpqamqwZMmSeJ2mpiY8+OCD6NKlC0aMGJHMKQbmnHPOAQA88MADxvZE0T+PPPJI7Ny5E2+88UZ826effmp5/Oz59a4/hzt37sSjjz5qtdm5c+cW3TNtdd8S0lo4g7Afcu211+KLL77AhRdeiAEDBqChoQGrV6/GkiVL0Ldv37g9+/jjj8f48eOxYMEC7NixAyNGjMDatWuxcOFCVFRU4IwzzvA8xrHHHouTTz4Z06ZNw3/+8x8cdNBBWLx4sfUFAgBDhgzBkiVLUFlZiWHDhqFLly4477zzErb7ox/9COeccw5KS0sxceLEuJtjQUGB4Y+eDNnZ2bj77rsxYcIEjBgxAmPHjo27i/Xt2xc33HBDq9odMmQIgGbXzjFjxiA7OxvnnXdeoFmPu+66C8899xxKSkpw1VVX4ZhjjsF//vMfbNiwAc8880zCL+Cg3H777fFYBddccw2ysrLw05/+FPX19bjnnns893v22WcxefJkjBo1Cl/5ylfQ1NSEX/3qV/GBDQDceuuteOGFFzBy5Ej06dMHW7duxU9+8hMcdthhOPXUUwEA3/72t/HTn/4UV1xxBdavX4++ffvi97//Pf72t79hzpw56Nq1a9LnqPPXv/4Vu3fvtrYfd9xxOO6441BcXIyxY8fiJz/5CXbu3Inhw4ejuro6YcTRMWPG4Pvf/z4uvPBCXHfddfjiiy/w0EMP4Stf+YohID3rrLOQk5OD8847D9/5znfw+eef4+GHH0bPnj3jM3h7GDJkCB566CHcfvvtOOqoo9CzZ09rhgBou/uWkFaTRg8K0kr+8pe/qCuvvFINGDBAdenSReXk5KijjjpKXXvttaq2ttao29jYqH74wx+qfv36qezsbNW7d281bdo0tXv3bqOedHNUSqn3339flZWVqdzcXFVYWKimT5+uVq5cabk5fv755+ob3/iG6tatmwIQdxNL5OaolFLPPPOMOuWUU1SnTp1Ufn6+Ou+889Q//vEPo84etzLpTuflfpmIJUuWqBNOOEHl5uaqgw46SF122WXqX//6V8L2WuLmqJRSt912mzr00ENVOBw2+gFATZo0yarfp08fNX78eGNbbW2tmjRpkurdu7fKzs5WRUVF6swzz1QLFizwPX6fPn3UyJEjfett2LBBlZeXqy5duqgDDjhAnXHGGWr16tVGHelm98EHH6grr7xSHXnkkSovL08ddNBB6owzzlDPPPNMfJ/q6mp1wQUXqF69eqmcnBzVq1cvNXbsWPXOO+9Y5zhhwgTVo0cPlZOTowYPHmzdB3vujx/96EdW/yHcDxPh5+ao7//ll1+q6667TnXv3l117txZnXfeeWrLli0Jj/P000+rQYMGqZycHHX00UerX//61wndHB9//HF13HHHqby8PNW3b1919913q0ceecS6P2tqatTIkSNV165dFYD4c5bIZViplt2348ePV507d7auSaJ+EtJamIuBENJhCYVCmDlzZspmrwhpT1CDQAghhBALDhAIIYQQYsEBAiGEEEIs6MVACOmwUIJFiDecQSCEEEKIxX4xQJg3bx769u2LvLw8lJSUYO3atenuEiGEENKuyXg3xyVLlmDcuHGYP38+SkpKMGfOHCxduhSbNm1Cz549ffePxWL45JNP0LVr16RD5RJCCNn3KKXw2WefoVevXlYSsFSxe/duNDQ0pKStnJwcIyPn/krGDxBKSkowbNgwzJ07F0DzF37v3r1x7bXX4qabbvLd/1//+pdv7HlCCCGZz5YtW3DYYYelvN3du3ejX58uqNmammR0RUVF+PDDD/f7QUJGixQbGhqwfv16TJs2Lb4tHA6jrKwMa9asSbhPfX29Ecd8z/jnVHwdWchu2w4TQghJOU1oxItYnvIw3XtoaGhAzdYoPlrfF/ldk5uhqPsshj5D/omGhgYOENqS7du3IxqNorCw0NheWFgYzwwnqaqqwg9/+ENrexaykRXiAIEQQvY7/jfP3dZm4i5dQ+jSNbljxNB+TNn7hUgxCNOmTcPOnTvjy5YtW9LdJUIIIfsBURVLydJeyOgZhB49eiASiaC2ttbYXltbi6KiooT75ObmIjc3192waxQaCovVlte1cOwbaCScjCgnmRF3isRA+0wc6vqsSPsltm9kVCmTa8WS+AJJpg8Bjus8V7/r7fiCVHJf15dpGuRxMSjEkNxxk90/k8joGYScnBwMGTIE1dXV8W2xWAzV1dUoLS1NY88IIYSQ9k1GzyAAQGVlJcaPH4+hQ4fipJNOwpw5c7Br1y5MmDAh3V0jhBDSjoghhmQNBMm3kDlk/ABh9OjR2LZtG2bMmIGamhoUFxdjxYoVlnCxtYQiEbFBmBgi2rqccpdT544peWuaXU6Hu8wVVt00mD3a0iQSpO1UmSsywRyRiXE5MsXrOVVmgyDn41PX+LSCmgkcbbfVdL51TFdbop2QqOvuo+iDXleWRWVd8xlQ0dS4GbaWqFKIJvkMJLt/JpHxAwQAmDx5MiZPnpzubhBCCCEdhv1igEAIIYS0NRQpmnCAQAghhKD5yz3KAUKcjjlA0O30Ls0BAGgaBUuvIO3Ylp5BK5faALGvYf/30zY46/roFQLoDJTTxTMJvYKrPIg2YB9pF9Q+c9PcN4ex2EeaqlBrbbNB9wtS32mXb2WZT7m07zuviyxz6Qp863prBSyNgdVHbV9ZV+oGtH2lpkA+SUpKDkLKUUj2NR1zgEAIIYQIaGIw4QCBEEIIAb0YJBkdKIkQQghp78ybNw99+/ZFXl4eSkpKsHbtWmf9pUuXYsCAAcjLy8PgwYOxfPlyozwUCiVcfvSjHwXqV4ecQdDDJ7s0B83lEc8y+O2rawdc+gTZlo9uQAWo69QkyHatfeGN47i+NvtWtitRQaQBAeMetFp3kIGhDdqUVv5YCqRHCBgTIeSq7menN47rOoZPO664B6JdZ1t+sQwcdUNWzAHvfX3raloCJbUM8lnR2rI0B2Ldely0i5OOlAYxJC/JCbr/kiVLUFlZifnz56OkpARz5sxBeXk5Nm3ahJ49e1r1V69ejbFjx6KqqgrnnnsuFi1ahIqKCmzYsAGDBg0CAHz66afGPn/5y18wceJEXHzxxYH6FlIpCzCemdTV1aGgoACn44J4NsdQ1t5xkf43AA4QjH3hDQcIieEAoUV05AGCbDcTBgh2AKMAAwQpUtTbEmVWICRZ3tSU8O8m1YhVeAw7d+5Efn4+Us2e74m/v9UTXZNM9/zZZzEcO3Bri/taUlKCYcOGYe7cuQCa0wn07t0b1157LW666Sar/ujRo7Fr1y48+eST8W0nn3wyiouLMX/+/ITHqKiowGeffWakLWgJNDEQQgghAKIqNQvQPOjQl/r6eut4DQ0NWL9+PcrKyuLbwuEwysrKsGbNmoR9XLNmjVEfAMrLyz3r19bW4s9//jMmTpwY+Hp0SBODQVi6OcpZAm1dzDaEshx1AXNWQBxHydmHsGNWQNRVel05xLNcFeVxvOvaMwr6fj6zDfqqq51Ex/XqX6LjeB0zAcnt6y43aKOwzYH6EADnL+xkCPBL37cPjnLf2Ycg+7rmg+UvcuVdJo9pH0ebzrd+yDt+2cvZBmdYY7PIP8yxd0hka/ZBewdZZfLdFvJ2T7RMDu14Art3797G+syZMzFr1ixj2/bt2xGNRq3UAYWFhXj77bcTtltTU5Owfk1NTcL6CxcuRNeuXXHRRRcFPAMOEAghhBAAqdUgbNmyxTAx5ObmJtly63jkkUdw2WWXIS8vL/C+HCAQQgghAGIIIZqkkCj2v/3z8/N9NQg9evRAJBJBbW2tsb22thZFRUUJ9ykqKmpx/b/+9a/YtGkTlixZEuQU4lCDQAghhKSBnJwcDBkyxBAPxmIxVFdXo7S0NOE+paWllthw5cqVCev//Oc/x5AhQ3D88ce3qn8dcwYh5LD3W+GTNdubn+ZAlCt9XWoBHBoEFXGHWjbKXWVI5JmgexuYRba3hO7xYFZ1aRCsdi39gvdx7TJ449enlrYDQDk9K9z7trgPydLaptvQzBvIG8GlDXBqAQL2wenFIPfVyxyaA8CpI/DVIGiroahDcyDb9gnLbLRlaQ7ETW3pDLz3VWHRllYecmgMAPM2VdJX0fLxDJD2fh8QU8lnGg+6f2VlJcaPH4+hQ4fipJNOwpw5c7Br1y5MmDABADBu3DgceuihqKqqAgBMmTIFI0aMwL333ouRI0di8eLFWLduHRYsWGC0W1dXh6VLl+Lee+9t9bl0zAECIYQQIoimwMQQdP/Ro0dj27ZtmDFjBmpqalBcXIwVK1bEhYibN29GWPshOHz4cCxatAg333wzpk+fjv79+2PZsmXxGAh7WLx4MZRSGDt2bKvPpWPGQcjOiZeHcrKN+qFsMWbSYyZkm3U5g4CE5ZxBaCM4g9CyPnAGIfFxAswgWB4P+gxCk5hBkOt6zITGRlG3yVhVjWK9oVEra9i72z6Kg/Dy34vQJck4CJ9/FkPJsTVt1td9CWcQCCGEEKRnBiGT4QDB+mXv0BkEmTGQ9WVd+UvfOI6MZSDWs8KeZda+jhTO1q9meRznbAM869plPvuGXDMV3vv6xglwzUxYdb2Lktk3cFsZhn/MBP0DSaItZ+wCWdcdsNecFfBrSy/ziW0Qc5X5xUVw1JWzBDHvulYftVmAUEzEdGkSMwaiXOn7yrTM8r2ozRK4r77AFbcBsGcq0kxMhRBL8iFNdv9Mgl4MhBBCCLHgDAIhhBACmhgkHCAQQgghAKIII5rkxLrbCXT/omMOEFyx84XN3szIKGx4AeIi6LqBhOta21ZZAA2CtPdbWge9vqwr29JOx9YymPu6tAGWTsKlMwikQWh9uxKn2bAN9w1EJngxBNEKpGpfy54vP2hZrhxl3m37tuv0YhDvDUfGxlBU1vXOD2FpEIRnQijiqBt2H8fQKFjPs9AvwBtLk2Ccq8zT4HMTt1Fek5aiUqBBUNQgEEIIIaQ90zFnEAghhBABNQgmHX6AEPIL9RlxBDuS65bbo2YKyPYuA6SJwexTzDJt6K6K3mYBv3Jf84TDJdJa16f+g5gUZFsBTAxJuUT6mg28XS8tknGRDEIGmBha66ooy4OkbPYPSiTLvV0vnSYGyyzg3a7tfij2tdI0O/aNhcR6y80RetRjPxNDWLoU6ve49cx632xWifwsDbOseCGJoEry/ZvuqH1RFUbUGTWtJW2kqDMZAE0MhBBCCLHo8DMIhBBCCNCcqjmW5O/mWNrnQVIHBwiEEEIIqEGQdMgBQshle3PY4pRMsCS1AdKlMMvbdTHmcHuU7cSEJkEv963rcHv01RWE9b/99AreZX6hl4PoF4LoCpxujn76hRTVDVyeaaTSddFYd4RHlnUD6Aiscr+6DtdFK4GUoVfwcWu01vWQyH77anoF6dYo9g036XoF0Y51z4tQzNoJWzndxK6GzkAmjJIhnLX1UJPP+1W6YurvW9kHss/pkAMEQgghRJIakWL7GdpwgEAIIYRgjwYhyWRN+900oTf0YiCEEEKIBWcQLLucGP3pOgOfOAgqIlM6hxP+DSTSJIRaVNZcrpVZaaNlDAWzy4ZWwArD7KhraRnEuktHECCGglXXpUHwTSPdwrJEBIlt0EahltsqYqt/CmcHgUIit7IduW9QDYIrLbPcV7f3+2kQnGmYxb5SD2DEQXAfR9cdhMQzGhbt6s+ALLPs/6KTIe3AYfHgWbPk+vk6+tvcmHd4eivugYw7k2ZiKcjFQC8GQgghpJ1BDYIJBwiEEEIImmcQGAdhLxwgSKzQyyHPMjlFD6ebo3tfva40KcSyvcMlSxNDTHyiLjOCZX5wmSN8QzprK0FMCqK+b90g4ZNba46QiKnZQG6OAcwE6UoCF8jk4DO972zXcYJBQiD7ui4GME8YbfuEWjbr+rgqWiYG1eK64bC3OUKFzU6FHSHBfRMnag+eUuaBrIyE2gMkzSvyHWOYNlzvU5LxcIBACCGEAIiqEKJJjtST3T+T4ACBEEIIARBNgUgx2o5MDJklISWEEEJIRtAxZxB0NxzLJU+MmXSbmQy1LN0crXDEe9dlymZLZ6CtS82BS1cgy2y3R7mvXte7XVnXNyxzgLrO0Mt+YZmNuj7agLCjzC/0squuxKWLsOoG+HXRVjOVgTQH7k44wxpbbWl2eL8+udI9B0rLLOo6wye7+xSKJf4bSKA5EM+WGT5ZlAldgX7f2uGTHa6LoixkXZgAvrviwQtrrozyPReS70z9XWfFcJbvUJ/yfUxMhRFL0oshRi8GQgghpH1BE4MJTQyEEEIIseAMAiGEEIJm61WyXgjSUrU/wwGCj5+uES7ZCq3sHctArvvHQdDL4Kyr6w4sLYPc16FRcOkT5Loz7oFY99UgWOXKs65Lv+Cb7tmhV/CNgxAkTLNLV9BGYZjbDOtUlE+5XtZGKZxlu35aASM1sShzaBJkKmVL6+DSIFiaA7GuaQlkdOGQI5V6WOgT7BTO+gYRI0HcYErYxo3LFJN1zcPoKZyVjIMQFScbINRypsVFSE2gpPYzMd9+zoQQQgghKYMzCIQQQghSlYuh/fzu5gBB4poCs6bKW+7maIcqlqaBUMK/gQSujLpLpFVmrrvME4FMDH7ZHI0skcqzLNG6yx3Rrqs86zozQUpXMj/zhOE+5q7rxMe04d43QN0gJBVa2dUp7ylsWRxS7iltoyk/t0ZXuV9IZKOuctfVTQzRgKGWw4n/9l33c10Mea7ANg95+/JKE4myQjx7v8ts10XdnpLZJgVJDCHEknzwkt0/k+AAgRBCCAFnECTt50wIIYQQkjI4g0AIIYQgVYGS2s/vbg4QpAFQ2teSSfds2OXNqtI9MUj4ZN2V0dIcBHB7tPoUxM3RoTOw6krTpyhHEDdHXUtgaQ68Q9Za+NUNokFwuDk6Ta5+YZfToUHw8QF3RpF12LjlupVO2HJd9Hbfk/ZxS8/gSuHsWpd6Bakj0G8J6X4o25XhiB1mefnK0T93eVnCYueYcVFFZevzEH1W3u8cK6Wz/nxYIdmlTsKR7tl6v2bWl2lMhRBLNg5CO8rmmFmfDiGEEEIyAs4gEEIIIWgOcpSsiaA9BUriAIEQQghBqrI5coCwf+MyDDtsZlaoZalJcGgU7BgJ5mFihr3fJ2Vzlndd31DLAeIgmHWVs64z1HLEbe83yh1hmAGYdnm/2AZhbx2BlWLX4V/u9j0Xt4yo65QgBEn9nKDtFhPAJmppA2S5o21nLAPZto+93Aj9a8U9cIcQNspdZTD1ClJzIO9xPfaBFbvA0iCI+0B7/qUZXkZ4doVesTQJxvV3x6GQn21M0xlY5+6I26KafN572ntSajF84yBkeJyEjkb7GeoQQgghSRBFKCVLUObNm4e+ffsiLy8PJSUlWLt2rbP+0qVLMWDAAOTl5WHw4MFYvny5Veett97C+eefj4KCAnTu3BnDhg3D5s2bA/WLAwRCCCEEe00MyS5BWLJkCSorKzFz5kxs2LABxx9/PMrLy7F169aE9VevXo2xY8di4sSJePXVV1FRUYGKigps3LgxXuf999/HqaeeigEDBmDVqlV44403cMsttyAvLy9Q30LKmp9rX9TV1aGgoACn4wJkhbIBAOHOnePloQMOMOqHOncy1lWn3PjfsbwcoyyWZ87fx3LNOclo7t4bJZZj3jTRnJDneizbJ9Rytl7mrksTQ+Iymhg8qu6HJgZnuZXN0du9UoZPtlwkdRODn/ukdJHU9g03+dWFd12xrpeHm0Q2x0bvus3le+tHGsx95Xq4Ye8JRurNkw3XmycQ3t2k/d1glIW+rDfW1a4vzfUvvoj/Hdu1K/53k2rEKjyGnTt3Ij8/H6lmz/fED18uQ16X5Czvuz9vwsySZ1rc15KSEgwbNgxz584FAMRiMfTu3RvXXnstbrrpJqv+6NGjsWvXLjz55JPxbSeffDKKi4sxf/58AMCYMWOQnZ2NX/3qV0mdS8fUIOj42cicuRik7c173S+Fs/sL1lyPOWImuAYEsi17X+9BgG+6Z+1L3jdmgmvA4BefwIiDIO28jnWfAYLliq71w6orBwFOSYt735a205a4fiLIAYNrAOFn89a/9K0y2ZbjS95KTWx96YcS/w1YqYqNAY64L60Bg34vii91yLqOWBm25sDcoB/G0hyIdaPcSovtjh9hxi6RmgMZB8FbT2W9Qx25JPyDQKSXKNAqE4Fso6U0NDRg/fr1mDZtWnxbOBxGWVkZ1qxZk3CfNWvWoLKy0thWXl6OZcuWAWgeYPz5z3/GjTfeiPLycrz66qvo168fpk2bhoqKikDnQhMDIYQQgtSaGOrq6oylvr7eOt727dsRjUZRWFhobC8sLERNTU3CPtbU1Djrb926FZ9//jnuuusunH322Xj66adx4YUX4qKLLsLzzz8f6HpwBoEQQghBapM19e7d29g+c+ZMzJo1K6m2W0Is1jxVdMEFF+CGG24AABQXF2P16tWYP38+RowY0eK2OEDwwxVqWZpCXWmMfdwcjVDLSYVAdq8bugJhUrBMDmHvuk4zgo+JwdIO6OtymtdhNrBczeR0fjimlYlD+poNVMvrwptwIBNDeuRAbrOB0Li46vrt6zIxOOuKdmPC3dgRatnXHKGbBmRd5/NsFln3otQVaHeJdS+KK6enC5ZdcOk8pAkhJu0Tlm5Cu8ZRb5NCc0cc4dBt+1zivzsYW7ZsMTQIubm5Vp0ePXogEomgtrbW2F5bW4uioqKE7RYVFTnr9+jRA1lZWTjmmGOMOgMHDsSLL74Y6BxoYiCEEEIAKIQQS3JR/xvg5efnG0uiAUJOTg6GDBmC6urq+LZYLIbq6mqUlpYm7GNpaalRHwBWrlwZr5+Tk4Nhw4Zh06ZNRp133nkHffr0CXQ90jpAqKqqwrBhw9C1a1f07NkTFRUV1knt3r0bkyZNQvfu3dGlSxdcfPHF1uiJEEIISZY9JoZklyBUVlbi4YcfxsKFC/HWW2/h6quvxq5duzBhwgQAwLhx4wwR45QpU7BixQrce++9ePvttzFr1iysW7cOkydPjteZOnUqlixZgocffhjvvfce5s6diyeeeALXXHNNoL6ldYDw/PPPY9KkSXjppZewcuVKNDY24qyzzsIuzb3lhhtuwBNPPIGlS5fi+eefxyeffIKLLroojb0mhBBCUsPo0aPx4x//GDNmzEBxcTFee+01rFixIi5E3Lx5Mz799NN4/eHDh2PRokVYsGABjj/+ePz+97/HsmXLMGjQoHidCy+8EPPnz8c999yDwYMH42c/+xn+8Ic/4NRTTw3Ut4yKg7Bt2zb07NkTzz//PP7f//t/2LlzJw4++GAsWrQIl1xyCQDg7bffxsCBA7FmzRqcfPLJvm36xUEId+1i7nCAGQchdsDewBKqU7ZRFhVxEKKdvOMgRHO94x7I9agZbsGOi5Cd+G+gBW6P2cq7rkM7INux3KB0jYLUGPjEQQhFNK2AjwYh7HA/lFqBsKZB8NMRRBxaAauuPD+P/iXaV5YbdT1L2hbXC0BqDoJoEqJWSGRvDULUcZxYTOoTwmLdW2dg9V/Wjep2eBn/3Fx16RVCIvywdJHU4xdYZUKvYMQ2aPRux64ryqx1GetA/9sdByFSr8VMEHEQIl+aJxDR4iCEvjQ7Ef5it9mpL8w4CLHPPt/7dxriIHzvb+cit0u2/w4O6j9vxL2nPNlmfd2XZJRIcefOnQCAgw46CACwfv16NDY2oqysLF5nwIABOPzwwz0HCPX19YY7SV1dXRv3mhBCSHsgmoJsjsnun0lkzJnEYjFcf/31OOWUU+JTJTU1NcjJyUG3bt2Mui4f0aqqKhQUFMQX6WpCCCGEEH8yZoAwadIkbNy4EYsXL06qnWnTpmHnzp3xZcuWLSnqISGEkPZMTIVSsrQXMsLEMHnyZDz55JN44YUXcNhhh8W3FxUVoaGhATt27DBmEVw+orm5uQndSQzC3uMi2/9XK5NxD6xwyTJcqaPMyjngKEsiDoJLZ+CXM0E5YiZYsQ2MOAjCDm+txzzLpY0+LOrqWgKX5gAwdQVWmUPb0Fyu6SIAZ92wQ6/gqiuR/vD7iphD/SBfdi5Ngm9d7e+o1BFITYKuIxB1o8Lh36VJsPQLQmcQM0IIi3tc1DW6KNMjQ2BdUn2Dd7hnQIRD9wkhoivIrFDKct1K6Zz47+Z179DLrlTQgHk6Mj6E3Ne6TI53874ghjBiSf5uTnb/TCKtZ6KUwuTJk/GnP/0Jzz77LPr162eUDxkyBNnZ2YbP56ZNm7B582ZPH1FCCCGEJE9aZxAmTZqERYsW4bHHHkPXrl3juoKCggJ06tQJBQUFmDhxIiorK3HQQQchPz8f1157LUpLS1vkwUAIIYS0lKgKWR41rWmjvZDWAcJDDz0EADj99NON7Y8++iiuuOIKAMB9992HcDiMiy++GPX19SgvL8dPfvKT1HUiSChQK/OjuWqZIEL69KUoc5gc/MMyt6ysed2RoVGaDRzZHWVda65TK3eZEIAEpgGtfkTsK9f1KfqIj9lAL7fq+kz96/UtM4GYIjbCMgcwMQQ1KYRlTuEWEiQ/vTQ3+JkN9HXLBdLRlq+JwVHXXo95llvtinskqpkR5NRwzMrhrJ2rnDsXuL8jZKF4DvVy4YVuh47W/pbPvmVSkO8Vh9lAmluMcxf3rW2DQ4vJsFDMqdAQUIOQIloSgiEvLw/z5s3DvHnz9kGPCCGEdFSUlo0xmTbaC+3nTAghhBCSMjLCi4EQQghJN1GEEE0ypmmy+2cSHCBIpE3MsL1Jdx4fTYLTjUisu1wXXS6RATQHwfd1hE8WmoRQlmazl5qDiAjFKsp1nYF0R8yS65GW6wqyHBqELGFflu6JWQ4NQpaIjRt2aBAkQTQIfm21FpeN1E+D4GpL1m0SN5he3uSTsrlJu1Gl5kDuK0Vhev0m4apouaFq97WtTxDXIhTR/jbvHyUnY0VIZONSWCmbvXUFVur0mLcmwXJrDOIu7fd+0tcdWitr3fE+zURiKnkNgXRN3Z+hiYEQQgghFpxBIIQQQtDs8ZOsSDHZ/TMJDhAIIYQQNJvYXJFFW9pGe4EDBD8Me5osM1etMM26O7NDnyDLfW2HQbQNjnDKzpTNgBky2aE5AIBwlreOQGoOsrJMG75u78+ScRAcmgSpT8iWWoeQd10/XYFLgyC1A1nhvftKHYRE39dfr9C6uAd+uH7hWHEOfF52UUNXIDQHIh6xS4Mg9QrZjrpR0f/GqLlvk0MTEhEG4qaod5hsSwCgn4+IgyA/KUuTYJS5NxhaAqlPSCZEu4yL4HrnON51rvectZ7hmgPihgMEQgghBIykKOEAgRBCCAE1CBIOEGT2sAAuO65pOFnun81RKw9gNgji1miVyxlU6cqotS3DJ1uujPrUf5Y0MbhNAbpZwTYTmMfRy7PD3mYBwHRlzApQFzCn97OtMhk+WXOn9DFH6HX9TAwRa+I6NUQd0992KGU5le4dEjkW9jYpAECj1lYsLE0M5r66WaEpJEwIok8R8fk0aqaOsDA/RMXnHtLaDkXdn0dIMys0CTdGROR1E26QxkPr3tfYVbouOtweVdT9jrHfK45MlvJ9pd+rPiHmXa7hIWlySHP2RuKGAwRCCCEE/xMpJhsHgSJFQgghpH2hUuDFoDhAIIQQQtoXzOZo0iEHCJYdrIVYn3sQXYGPXgEud6Ugrk3SPugInyzLINZDhgah5eGTg2gOZHm2j+uirjvIsXQFDvdJYae29AuOcpdbI2BqBfzSPbt0BUFCK0u7u0S6ArpwvdCkXsGV7lnWlW6PudpN3xhz6woaNW1Ak7gnLBdJoVFwhb6WLpGtRYaGhnDpVJZYQCX683/rYoNLg+DQGQR1eTY+rgAu3FKvYL0Hk/h+bO27mbQNHXKAQAghhEjoxWDCAQIhhBACmhgk7WeoQwghhJCUwRkEieWn613mFwchUKjlsHfdQHoFK7aBLHekcJYhIYw0zDJFs3f4ZD/NQY7UFUS8dQWyrZzwXgd0GcvA2ldb99cgiH21dWnHznake5baAKlf0Mv90j376Qxai0ufYMc58IuDoMU2kHEPQt7pnrOs2Abmuv55ufQJANDgiEvhFybbiIOAZDD7JNMyx7RnQAn9hXwO9UsRkpoDKw6C3o7okk+8giBaJjN8sl9d75gumR56mbkYTDhAIIQQQkATg4QmBkIIIYRYcAaBEEIIAWcQJBwgJGMTc+VtQLB0qsa6rz+z8qxr2zMdOoOwjHsg4tRr+4ZlGmax7krZbMUysHQF3vqFvEij53F0PQIA5Do1CN4aA9muLJdaAEuDAIcGQaxHjHTPbo1BxEej0FqiDhupdNGSda1yXYMg6jYKg7leN0vJ2AZSE6LFQXDoEwD7OjaEsrSy1l9D154yDoKSuRhiolx78EIxkadBxHXQ4wrI51fcemZdn3wK1nulteno5Tszhe/QdMMBgglNDIQQQgix4AwCIYQQAs4gSDhAkMhpOYfLThA3R1foUtm25YXmck/ymRq03Yy0aUhHaGVAuO/JdM8yXbIjZbMMn+xyZZQmBVk3N6K5OYqp5VxhctBDIssyaSZwrfuaGPR0z470zs3l+1e6ZzvUsrcJQpa5TAyyTLou6iaI+pjbVVGip9yuT+IVZ4dT9i6LivWIlcLZ22wgXSKhp532C+fuMGO63hvNbetl8r0n+hTEzdHhGm69XzMMheTdFNvGMJgeOEAghBBCwBkECTUIhBBCCLHgDAIhhBACziBIOEDwQ7Oh2e495qrLddFPrxDI5ShQildvN8eQdHMU67pro8utEQAi2npEhib2cXPUdQcuzUFz+d51P12BXi5DKwfRILg0B7Jc6gbs0MveugJ53azyVmoSXJoDQNjPxb0Xg7dbo2xb6gqylXnd9PKIcHN0rcvzlroC+XnUx1LzWpO2aP3FH5EaHKkVcLg9yi8Q+dyZz7dPauUg7wLX+yql7zL9ftq/viw5QDChiYEQQgghFpxBIIQQQsAZBAlnEAghhBA0u6+mYgnKvHnz0LdvX+Tl5aGkpARr16511l+6dCkGDBiAvLw8DB48GMuXLzfKr7jiCoRCIWM5++yzA/eLMwiptJEFiIMQLGaCo65lo3T4L4tyS3MgU+Nq5bJMhlPWNQl2HATvlM1yX5fmADB1BVKD4NIkSB1BXrjRsy5g2rVlWU7IPI6uK5A6Amk/d8VMaKv0zn7ougLf0MohqUnYWz9HlDUooRXQdAUufQIA7I5l793P7z6VcQQCoOsMcpT5ucpfgrGIt44gJjQHURE+2fUs2SGStXUrjoAjdLoM9e4TFyFV76ek2M80Cm3BkiVLUFlZifnz56OkpARz5sxBeXk5Nm3ahJ49e1r1V69ejbFjx6KqqgrnnnsuFi1ahIqKCmzYsAGDBg2K1zv77LPx6KOPxtdzc3MD940zCIQQQgiaB4ypWIIwe/ZsXHXVVZgwYQKOOeYYzJ8/HwcccAAeeeSRhPXvv/9+nH322Zg6dSoGDhyI2267DSeeeCLmzp1r1MvNzUVRUVF8OfDAAwNfDw4QCCGEEOzVICS7tJSGhgasX78eZWVl8W3hcBhlZWVYs2ZNwn3WrFlj1AeA8vJyq/6qVavQs2dPHH300bj66qvx73//O8CVaIYmBokjI6PfNJztGuTtPuZyZbTdiMQUpMvlyCe7o2liEIeRU7naunTrst28tOljy6TgzpyomxH8wie7TAwuM4LtAuk2MehmBOmamBMg1HK2MEfoSJOCX/ZGl4ukC+mqKIlq96l0Y5T3baMwG+j7SnOEfd32lrvMDxLpAmldhgA/c2Qf9XtPvthzhBlEL4+GvU0tgP186PVt92LRSSNbq4+bo9P9UL43HC6SAVwXlSsMs1i32+04JoW6ujpjPTc315rm3759O6LRKAoLC43thYWFePvttxO2W1NTk7B+TU1NfP3ss8/GRRddhH79+uH999/H9OnTcc4552DNmjWIRCKySU84QCCEEEKAVosMZRsA0Lt3b2P7zJkzMWvWrKTabiljxoyJ/z148GAcd9xxOPLII7Fq1SqceeaZLW6HAwRCCCEEqXVz3LJlC/Lz8+PbE4kEe/TogUgkgtraWmN7bW0tioqKErZfVFQUqD4AHHHEEejRowfee++9QAMEahAIIYQQpNbNMT8/31gSDRBycnIwZMgQVFdXx7fFYjFUV1ejtLQ0YR9LS0uN+gCwcuVKz/oA8K9//Qv//ve/ccghhwS6Hh1zBiFFKUet0MuSAOFJA6VTNdwcZV23fVC3f4Ycbo3N65ptPSxd8rzDKUuNQZaPJiE3QFpmI3yyj+tirkODkBeSGgThXqnVl6F8LQ2CZhR3lQFuV0ZfDUIr3SCl3V1iuDaK+0VqEuT5NWjuiTFhTJe6Ar0f1nWRryKtKZc+oblhsa7ta7kjhr01IfI6yX2ztHLpytsk3Brl86I/S2GhX4iFpCZh77qta5J1W65zStk7R+D7HgxChqeDbgsqKysxfvx4DB06FCeddBLmzJmDXbt2YcKECQCAcePG4dBDD0VVVRUAYMqUKRgxYgTuvfdejBw5EosXL8a6deuwYMECAMDnn3+OH/7wh7j44otRVFSE999/HzfeeCOOOuoolJeXB+pbxxwgEEIIIQKVAhNDUA3D6NGjsW3bNsyYMQM1NTUoLi7GihUr4kLEzZs3G4PK4cOHY9GiRbj55psxffp09O/fH8uWLYvHQIhEInjjjTewcOFC7NixA7169cJZZ52F2267LXAsBA4QCCGEEAAKgGp93K14G0GZPHkyJk+enLBs1apV1rZRo0Zh1KhRCet36tQJTz31VCt6YUMNAiGEEEIsOIMQAH/NQctjKARJvWrpDFz+yz5xEAwNgtAKhGWsg5B3HAQr3bNmH5exDGRdK/VyWNcveGsOAFNL4NIcAKbOwE7n7K05kPX96pqhlr1TQUus1NBtpUHwi4Og3XAyNbTsvwyJrJ+7PI7UGTS28nVjpbn2+1mjVY8Jm7Y8Pz3qXZPQIMj1rNjehpt87vEm6/nQwlmLspDoo77um+5Z1zlZz75YTyqFs14mK7vjLexPxBBCKMlY0kEjKWYyHCAQQgghSG0chPYATQyEEEIIseAMgsTKnuYYDQZwDQriciSnCp0hVOUUpE8fDY82eapON8eWh1qWZgLL5GCtO9wcpTnCkaHRtS7NBNI8YZsYNHdKmGUuM4Kf2cCZzTGAvElmBJQYSmwf04RpYnBnc5Tnrmd3dJkf5L4Rv1DLji5bZgKZYVJblyaGXHhnbMwKmf23TWWaKUxeF5/nw+XmaM3IB8mcaGR+NItcoZX9jpPUu8zon/Szzuxf1zEVQihFgZLaAxwgEEIIIWj2YEjaiyHJ/TMJmhgIIYQQYsEZBEIIIQQUKUo4QAgS2jOZzz2QG1GAfX1SvNqpZfeuS82BDL2sh4uVoZWlfVa3iQdxawSC6Qp07YDLrbF537325iCaA8DUHfjV1bUDsr+2BkF5lknCrQq58j8c96p0w8rW/rY0CEIMIMt13YHUJ1hujfrp+NrWjU60vK4gFhNujkKv0KStN4n70uX2GI65nwf5vEQChDg3XZGlC6EMpe4dajml75wgBNk3w0Irc4BgwgECIYQQAooUJdQgEEIIIcSCMwiEEEII6MUg4QAhCZx+xUjgL9zasiTCMluaBP1vaSeVtlFtXfrdy331WAZB4h4ApmYhWGyDlodP9tMR2PoF79gG8rg5Wrm8TpYGAd66jkBxEHzKgwRl1nUFYZkeWfith8UNp/e5wadXRgwIvxTORh/8QkV7x0WQn5XUIDSG92oospSM3+EdF0Heww2irrwPDO2JKGtyPKPy+XWFTw703kDLy6xy2W47moduHiAkq0FIUWcygHb00RJCCCEkVXAGgRBCCAG9GCQcIBBCCCFo9sRN1kLQjiwMHCD4occzT2Zg6J8q2rGvo67tFy3XxapWLnUEdhwE71wMMtaBvi7TErviHsh1Pw2C3nZOEimbZX4FW1ewd12eT46lSdDOXeZXcOgMpH0v4nOLtNYe6BtGQHnbx2XcA6dGQd6o4nwiunFWlEWlIVsrl7oBSUzkV2jU9AB+GgS9vEnGSBD3bX1M0yv4pT93rPs9d8a6T5wTZTzPIvcCfHBqEtwpnV2YaaTbz6/pjggHCIQQQghoYpBwgEAIIYQAtDEIOEAQBJoSC5AiNVAoUx8zQZB2renLAKGW9aZcbltyPVuGYXaEGwZEGmBHKmW5LtMJW6YNR8pmaY6QroyGKcNhUpDrtlujiW5GsMrgJtLK6dqoj9+VHu1WmiPCym0ykSYIA3HYBq1qRDws8vPQ940K85Bt9vC+Z6SLZKNwR9TvN+ueFiegf84NAZ4HwO1e7Ay1bJkUYBIoRLvDBhQkHX0SYZnl+zXjfmunYAYhKVt0hkE3R0IIIYRYZMwA4a677kIoFML1118f37Z7925MmjQJ3bt3R5cuXXDxxRejtrY2fZ0khBDSbtkTSTHZpb2QEQOEV155BT/96U9x3HHHGdtvuOEGPPHEE1i6dCmef/55fPLJJ7jooovS1EtCCCHtmT0ixWSX9kLaNQiff/45LrvsMjz88MO4/fbb49t37tyJn//851i0aBG++tWvAgAeffRRDBw4EC+99BJOPvnkdHU5Jch7SLlsfK59A6Z4dbk5RsLedlRpj5WhZvVyaX/NSsLN0XIx1OzR0m7tWre1DcLt0RE+2aU5AGS6Z6PIqTPw0xSkavQeFseROgO9T1KvILPxWi6Thuuij0NlgHTPus4gR+hHYo7Qys3lez9bqTkIcu81ivs2HNv7uvR/HsxXqxFq2U/743Rz9F4P9N5AsHcO6ZikfQZh0qRJGDlyJMrKyozt69evR2Njo7F9wIABOPzww7FmzRrP9urr61FXV2cshBBCiC8qlJqlnZDWGYTFixdjw4YNeOWVV6yympoa5OTkoFu3bsb2wsJC1NTUeLZZVVWFH/7wh6nuKiGEkHYOszmapG0GYcuWLZgyZQp+85vfIC8vL2XtTps2DTt37owvW7ZsSVnbhBBCSEchbTMI69evx9atW3HiiSfGt0WjUbzwwguYO3cunnrqKTQ0NGDHjh3GLEJtbS2Kioo8283NzUVubm7bdFoaZCVB0jL77Osss/yZvcukmVtf9+tS2KFXcOkMpG7AjjHg7W9uxzKQtl3vkM5WXARDRyDjHph9cMU6cGkOmsv1Y0LUNcl26A4i0r+/jcLUxsRPnKhx/eVN7P45ZGguZF2XJkFUlboC/fOSYZj94l/ocREsXYFMy+zQzrhiY0hdTThmtuv3vBh15Xoo8d/NG1r+7Ns7+xzYURboXeb3nsxkGCjJIG0DhDPPPBNvvvmmsW3ChAkYMGAAvv/976N3797Izs5GdXU1Lr74YgDApk2bsHnzZpSWlqajy4QQQtoxDLVskrYBQteuXTFo0CBjW+fOndG9e/f49okTJ6KyshIHHXQQ8vPzce2116K0tHS/92AghBBCMp20uzm6uO+++xAOh3HxxRejvr4e5eXl+MlPfrJvOxEo41lq2vUN4RzoOC2f77LCw4a8p1/tcMneGQFdoZXlupy+l9O8xnGkmUCaEYx2fUwXDrOHy6TQXFfvQ8izrLmtveV+JgRpcjDb9ctw6Jjet/q/d4M0P1gZGUVTDVp9eV2kySHqmM6XobCj2k0v7xfp9tiozNeYcY8ot3nIFeY7mXs8yLPkJEhdQaCQyEm8Y5zvwf3xx3Q7MhEkS0YNEFatWmWs5+XlYd68eZg3b156OkQIIaTDQBODSUYNEAghhJC0QZGiQdoDJRFCCCEk8+AMQlsSJJRpa10i/dwa5a4OW6jLNSuI3dQvvbNd7u26aOkVDNdFM1yydH/TdQa2tsFn3QgzbeJyZXRpDgBTd2CV+YzXg6R7jmi9ssIni7qGXsHSEciW5XXzxk51vXdfqXWIOT4PqReRbo/yPmhUe3tl6wq814Pety5cmgQ/F0gjHLpo1/JCNcIyB3RrdOqrWl63fRFC8ifbfi4WBwiEEEIIQBODgCYGQgghhFhwBoEQQggBOIMg4AAhhQTybglU1xVeNUA7cKd7dtlN/fy8XeGS7VgG3r7pVnhbn7C6rnZd+/nZl40++cQCyHbpCoRd2IiDICbw/NM/t3LCzzcNs96uqOunSXCEWo7JVNFaedTX3q/1Q5lX3PqcRZ8MXYEVB8Fx7/mGCA+gVwjwLDnTPfvhjG3g+rACtCNoR158NqnIxtiOLhBNDIQQQgix4ACBEEIIwd50z8kuQZk3bx769u2LvLw8lJSUYO3atc76S5cuxYABA5CXl4fBgwdj+fLlnnW/+93vIhQKYc6cOYH7xQFCKGQu+wMheHvjhJSxhMTSWsJQ7iXkvfi2FYppi3vfCNTeJRQzFrtuTFuUewmZSxjwXCKhkLEY5xYKGUsE5hLW/sl2wr7/Qq1c3P9cfbD6L87PuN7W+biuobjmzs8nZizW5yzuA31f696z7k/t3hP3pf++2uLzfLQW6/mVi1EZ7ndDJpJp71+VoiUAS5YsQWVlJWbOnIkNGzbg+OOPR3l5ObZu3Zqw/urVqzF27FhMnDgRr776KioqKlBRUYGNGzdadf/0pz/hpZdeQq9evYJ16n9wgEAIIYSkidmzZ+Oqq67ChAkTcMwxx2D+/Pk44IAD8MgjjySsf//99+Pss8/G1KlTMXDgQNx222048cQTMXfuXKPexx9/jGuvvRa/+c1vkJ2d3aq+cYBACCGEAHtFiskuAOrq6oylvr7eOlxDQwPWr1+PsrKy+LZwOIyysjKsWbMmYRfXrFlj1AeA8vJyo34sFsPll1+OqVOn4thjj2315eAAgRBCCIFtwWntAgC9e/dGQUFBfKmqqrKOt337dkSjURQWFhrbCwsLUVNTk7CPNTU1vvXvvvtuZGVl4brrrkvqetDNUZIBQ6a29JLRzXyWe5Wom4zt1GgnCe2DTKvrTg3tcFX0ORc71LJe5tPHAGmZdc2Cn9tiOEWGZNmODGts9MNyITT7GBWplvVzt8Mlm+hujzLUcqOo6/rs/MNk6ymcxece4FZM5r612tIO7Ap/3ryessMaZIT3XQa8X52kMA7Cli1bkJ+fH9+cm5ubZMMtY/369bj//vuxYcMGhJK8mTL94yKEEEL2O/Lz840l0QChR48eiEQiqK2tNbbX1taiqKgoYbtFRUXO+n/961+xdetWHH744cjKykJWVhY++ugjfO9730Pfvn0DnQMHCIQQQgiQUg1CS8jJycGQIUNQXV0d3xaLxVBdXY3S0tKE+5SWlhr1AWDlypXx+pdffjneeOMNvPbaa/GlV69emDp1Kp566qlAl4MmBkIIIQRIS6jlyspKjB8/HkOHDsVJJ52EOXPmYNeuXZgwYQIAYNy4cTj00EPjGoYpU6ZgxIgRuPfeezFy5EgsXrwY69atw4IFCwAA3bt3R/fu3Y1jZGdno6ioCEcffXSgvnGAEIC2tOE52w5Sto/sjHYoWV0b4A7tGyTUcluRjL7CSv/sCLUcrF33vpFQ6yb8okqGr3ZrEpx9kH3UVsNCV2CqFdykSu/iR5BQy659/UJ3txlBnnefW7Gt3mcZoXXYjxg9ejS2bduGGTNmoKamBsXFxVixYkVciLh582aEw3uf/eHDh2PRokW4+eabMX36dPTv3x/Lli3DoEGDUt43DhAIIYQQIG3JmiZPnozJkycnLFu1apW1bdSoURg1alSL2//nP/8ZvFPgAIEQQghpJk0DhEyFIkVCCCGEWHAGIRn8bG0hj7/3JSmyjbrSLLclLk2CXyroZPqsj5z90jC7sHI1aC23lebArx23JkEcU1zDWIDbSZ57tDVZbJDgc5Wfu/L+nPeVpkWSsudlX2kbrOP6rLe0bH+D6Z4NOEAghBBCkDgHVmvaaC/QxEAIIYQQC84gkDbHz31sX+DnhpaqkbJf+OT9HXl+MvRyy9vxKdc/rzT9IsuE+5bsYyhSNAj8Nhs/fjxeeOGFtugLIYQQQjKEwAOEnTt3oqysDP3798edd96Jjz/+uC36RQghhOxTQkhBNsd0n0QKCTxAWLZsGT7++GNcffXVWLJkCfr27YtzzjkHv//979HYKHOyEUIIIWR/pFUG04MPPhiVlZV4/fXX8fLLL+Ooo47C5Zdfjl69euGGG27Au+++m+p+EkIIIW3LPk7WlOkkpaj69NNPsXLlSqxcuRKRSARf//rX8eabb+KYY47Bfffdl6o+EkIIIW2PStHSTgg8QGhsbMQf/vAHnHvuuejTpw+WLl2K66+/Hp988gkWLlyIZ555Br/73e9w6623tkV/CSGEELIPCOzmeMghhyAWi2Hs2LFYu3YtiouLrTpnnHEGunXrloLuEUIIIfsIujkaBB4g3HfffRg1ahTy8vI863Tr1g0ffvhhUh0j7YeoSn9sgJi0C4rVVHm8x6x0wpEUtZwZyPNrfTs+5Rlgx82E+5bsWxhJ0STwAOHyyy9vi34QQgghJINgJEVCCCEEoIlBwAFCMvjdCMrj731JiqZqY2mabo06dLQxUSb7aJQHDJur15ZZCMMBsjtaGQyNfpj9ldkdZdbF1mZ3lO1IYtrNKU0Irc3AmGjf1honrM/V9TnLPqQp9HXKnpd0mVrkx+66DdrRFyIHCCY0shFCCCHEgjMIhBBCCChSlHCAQAghhACpiYSYAR44qYIDhAC05cjQ2XaQsn00epVuaLrN1c/uK93HoprtfV/ZjGNJpFSRtvSYbmsXzQY5m5j48Pw0Ca1FHicIUbGvfu7J9C6ZzyMI8v4y7j0f3YC+r62L2EdfCinUBrTV+2y//gVNDYIBNQiEEEIIseAMAiGEEAJqECQcIBBCCCEATQwCDhAkqYq5mwRtOQLVzeVK2E3lYVNlF07GPhtV0g6vaR1EPIKotNkb2gazLFseR5SHtQsVFt2XwZN1u7zUDVihiZV3bIawjOvgo0loKX6aA72PduwC9wMhNQlmmVhXepn7XFyfne+6fo8kce+lUlegP0uWjEA+h+1ZG5AB71fScjhAIIQQQgAgBSYGziAQQggh7Q2aGAw4QGir+by2xOnaJKcrU2QmsKbOpZtjKOHfLWpL6e5j7qyLTrc0q67ueumelg6L40a0nxFyVtQVejlmhVYWO+utWf33m39tndORr5nAcFUUoZYdbo2udprbkv3Q6wYxD7XebVbics/1M6m57nG/56O1WM+v69naD19l++X7twPBAQIhhBACcAZBwAECIYQQAro5ShgoiRBCCCEWnEFIIYFGjoHqSrujSvhni5rS2pL2Tds+67C5OmywMgytFd42QKhlZ0pnqTkQ7WaH9jra2SmCTQt5zOEyGbY0B+Zx4Qi1bH0+RrnDBTIRAVNW78EvZbPh5uijOZDljVq5y62xuVy7RxwaluZ1Rwpnn+tk6gp87kWHpsW6Fx16Bd/nw/Es2W6OAfQLAfRIrW5H0J5+IRM3HCAQQgghADUIAg4QCCGEEFCDIKEGgRBCCCEWnEFoS3TTtN+oUnn87VvXHabVFdbVzxYaJLaBsZ+ffdYZB8FHrxDau96ozNs3J2RawRvV3qDIkZD07xdxEBxxESLiw3MpAWQYZusT0FetuA1m/yPWddL65zO2d8U+cIVH9tMcWDEhHGV2/IjWhU/WP8fmds1zl/eBEf/CSsuchK4gQGwDlwbBT/tj6IREu5acRN83yHvDp771vmpHv4p96Ujn6gMHCIQQQghADYKAJgZCCCGEWHAGgRBCCAFFihLOIPih4DntFFLKWFrdbiJ7n7aExBLsOCFzcRBTIWNR2iLL5BJ1LHbdsPeCkFjC5qK3Leo2qIixmO2aS6OKGIt1Tti7yOM0KhhLDHuXBqWMpVEsUexdGlXMWGJKGYteVy6NiDoX177yOHofrOOI/svz089dXhd53fRrKq+3/DzMz9xcrM9ZfkbGPSI/e1nX+15M5h4P8iyl6vmVWO+NAO+cYMdxvAeTaDctJLpOrVkCMm/ePPTt2xd5eXkoKSnB2rVrnfWXLl2KAQMGIC8vD4MHD8by5cuN8lmzZmHAgAHo3LkzDjzwQJSVleHll18O3C8OEAghhJA0sWTJElRWVmLmzJnYsGEDjj/+eJSXl2Pr1q0J669evRpjx47FxIkT8eqrr6KiogIVFRXYuHFjvM5XvvIVzJ07F2+++SZefPFF9O3bF2eddRa2bdsWqG8cIBBCCCGwZ11auwRh9uzZuOqqqzBhwgQcc8wxmD9/Pg444AA88sgjCevff//9OPvsszF16lQMHDgQt912G0488UTMnTs3Xucb3/gGysrKcMQRR+DYY4/F7NmzUVdXhzfeeCNQ36hBCELM55MXxcaNEtQFyVVmTDXKKT0ft0dt3a9LQVyzmmJ7XdFiYdNdzw5Z2/IwzdLFLSfk7RIZC8lwyrpLpNmOdHtskGNl18WRIY+1i5rtNwus1Y2E5HUwDypDPKcKl5umDMsswyfLfRu16tJVsdH6LPeuy+tt76vdT0HCb8P9udt1vV15XaGW9fs90b5+z4tRV66rxH83b3Cle5apob2r+pYn8y7ze09mMin0YqirqzM25+bmIjc319jW0NCA9evXY9q0afFt4XAYZWVlWLNmTcLm16xZg8rKSmNbeXk5li1blrB+Q0MDFixYgIKCAhx//PGBTiXtMwgff/wxvvnNb6J79+7o1KkTBg8ejHXr1sXLlVKYMWMGDjnkEHTq1AllZWV4991309hjQgghxE3v3r1RUFAQX6qqqqw627dvRzQaRWFhobG9sLAQNTU1CdutqalpUf0nn3wSXbp0QV5eHu677z6sXLkSPXr0CHQOaZ1B+O9//4tTTjkFZ5xxBv7yl7/g4IMPxrvvvosDDzwwXueee+7BAw88gIULF6Jfv3645ZZbUF5ejn/84x/Iy8tLY+8JIYS0K1I4g7Blyxbk5+fHN8vZg7bmjDPOwGuvvYbt27fj4YcfxqWXXoqXX34ZPXv2bHEbaR0g3H333ejduzceffTR+LZ+/frF/1ZKYc6cObj55ptxwQUXAAB++ctforCwEMuWLcOYMWP2eZ8JIYS0T1Lp5pifn28MEBLRo0cPRCIR1NbWGttra2tRVFSUcJ+ioqIW1e/cuTOOOuooHHXUUTj55JPRv39//PznPzfMGX6k1cTw+OOPY+jQoRg1ahR69uyJE044AQ8//HC8/MMPP0RNTQ3Kysri2woKClBSUuJpn9lfSEbw4nRd8lmUcLnSl2jMXLzc/mIIoUlFjMXlwtYUixiLdGlzLTEVNpYGlaUtkRYv0oWtUWWJxTxuA8LxpVG5F5cLpLVg7yJdBqNikS6GukthkMVytRSL4ZYJs49+52Oeu/s6mddUftbm5+Fya/Rf9t4j8v4Jcu/J+7bVz4N4JuRz5nomgzzbQd4bqRTZtSta8U5Nxs0xJycHQ4YMQXV1dXxbLBZDdXU1SktLE+5TWlpq1AeAlStXetbX262vr29555DmAcIHH3yAhx56CP3798dTTz2Fq6++Gtdddx0WLlwIAHGbShD7TH19Perq6oyFEEIIyUQqKyvx8MMPY+HChXjrrbdw9dVXY9euXZgwYQIAYNy4ccav/ilTpmDFihW499578fbbb2PWrFlYt24dJk+eDADYtWsXpk+fjpdeegkfffQR1q9fjyuvvBIff/wxRo0aFahvaTUxxGIxDB06FHfeeScA4IQTTsDGjRsxf/58jB8/vlVtVlVV4Yc//GEqu0kIIaQjkEINQksZPXo0tm3bhhkzZqCmpgbFxcVYsWJF/Ifx5s2bEQ7v/S0/fPhwLFq0CDfffDOmT5+O/v37Y9myZRg0aBAAIBKJ4O2338bChQuxfft2dO/eHcOGDcNf//pXHHvssYH6ltYBwiGHHIJjjjnG2DZw4ED84Q9/AIC4TaW2thaHHHJIvE5tbS2Ki4sTtjlt2jTDBaSurg69e/dOcc8JIYS0N9IVanny5MnxGQDJqlWrrG2jRo3ynA3Iy8vDH//4x+CdSEBaBwinnHIKNm3aZGx755130KdPHwDNgsWioiJUV1fHBwR1dXV4+eWXcfXVVydsM5GvaRAChUx2+QrLcleZ1a70ZxaVA7Qr/bFVTPP7jrl9t/WmXOlr5br0f8/1SaOrp+SV6XmlH3tY7fXEz5FxD+S+2u0t4x7I6xQW5RHtmjdI13PHZyfTI1uporV2pX0v5hNDQcYoaCmuuAfN7XrXtdIwO2JYyM9dxjrQPx8ZY6BBfM6NWuJsmc7ZFfeguX4k4d/N/fdOJ+6X3rnRVdcvhbP+t6wrn0NtXdZ1Pu9+7xhnDIWWryeTCjpwSHqSVtI6QLjhhhswfPhw3Hnnnbj00kuxdu1aLFiwAAsWLAAAhEIhXH/99bj99tvRv3//uJtjr169UFFRkc6uE0IIaW+kwcSQyaR1gDBs2DD86U9/wrRp03DrrbeiX79+mDNnDi677LJ4nRtvvBG7du3Ct7/9bezYsQOnnnoqVqxYwRgIhBBCUgqzOZqkPdTyueeei3PPPdezPBQK4dZbb8Wtt966D3ulHV+bEkvmg7en1loeFtWaGDSm+9xmApfJwTIpyKn/WDjh3wDQ5FiPhcWUrwhLmxUS65rZwAqJrMxJ72y1N/hvg5h6Djsm0yOirryo8jh6eUReU4fJIewwKQCmCcJlfvDDz/3Iz6xg9mnvCblMCLIuYE6lS5OCNb3vCIGsmxSay7M860pzhLwPdBOEdRzHulVmhVPWQy27nwf5vOjrfs+dse5jJgg56vrmfnS9c5IwBYSM91M7+rbsgKR9gEAIIYRkBDQxGHCAQAghhAAcIAjSnqyJEEIIIZkHZxCSQHrO+bo9trbM0a5l4rP61HJ3K8v+rK37pbNt0uy3TSoqysKedQGgKba3fmPIrUHQ7cRhURZx3M6yrh+6+1tOSCY9NtHd7LJFgmQrhbP24UnNQaNoN9xGP0WkrkDHpTFIVK5/HnaZ+Xno2gGX5kDWtVwgRd1AugLr3tN0BbLMum+96/qld9bX5XPmci+2XBMd75wg7w2Jn77Kle7Zeg/ux4TQAu1GC9poL3CAQAghhAA0MQg4QCCEEEJAN0cJNQiEEEIIseAMQqz1oZUDEcQ+GCDsqZ+ftHKEcfULtRyNedtNpX02WyuXPuFSV5AljJZ6XIQsqSsQ67tj2fDENdyVdlK/obF+uuIaS1t7tqZRkNcpIjUIWkdkmVx3IeMtSKQN3IURB8HSIIQ96zave8ccsMJmO8InS52B/jnLuruVeQ/Ui3vC3DdAHISYOw6CEevD53mQ90HUET7ZGWpZxt92xTkJ8t5AwHdOEILsG+T9uy+gicGAAwRCCCFkD+3oCz5ZaGIghBBCiAVnECTSb9A1BRYgm6NvBjS9roz66zIjWC5GjsyPYt061Zic+vQOtewKvdwkTApNYbOTLrfH+picdjf3DYe1UMXC/GC7PTr8r0RRTGSGjGrr0VCTUZYjXBn1qXSZNTJbukhq5yr752diMDJOBviVI80EEtPE4K7rMiPIrIou90S/8MmuusmYDepj5ivPdM/1dmsEgCatrSChlQHzWbJNezBxTf1L9LasMMxmVadbdirfZUb/rFjvjsrphyJFEw4QCCGEEIAaBAFNDIQQQgix4AwCIYQQApoYJBwgBMA3dakod6ZiDeJyJDUJ2rpsx4oo7HShknZSkZpYa8wv3XPUCEPrrutye5ThhevFLWq49/mFeNUO62dbd2G5/om2dNdFlz4BMDUKMtywrwYhUBLnvQTRIFhlYl+XzsBPg6D3wy98su7KKDUGLrdGWd/SHDhcGV1ujYB5X8vr4qtJ0MOWizL5HBqujdLN0aFPsjQGAULBBwrT7PMe3K9TPNPEYEATAyGEEEIsOINACCGEgCYGCQcIhBBCCEATg6BjDhBSFN7TtrV5h0ENEgchiE+ybZOUPtbmzipAyFczDoJ5IBlKtjGq+fcLY6iMi9AgTijsyBcry8L6ZycNZK6wByLOgdxXahRi2Bv7QMZXkG3pfZS29GwRQ0H/7OR18tUgBExZvQepDZAYcRB89Ary/PR9pdbB0iBA1yC4UzbXO8IluzQHzft6x1CQmoR6TXfQYGkQvDUJ+v0OuEMrA35xEBzh0a13gUOTEOS9IdeD7mvUTeE3YrpDL3OAYEANAiGEEEIsOuYMAiGEECKgBsGEAwRCCCEEoIlBwAGCxIploJfJuuaqHdtAT3zQ8jjpztwLot2gcRBgxEGQ+3prEnxzMWgdkf7kMjWx1BU0hPbehhFRV9qMnTg0CVGpQZBVRbkeq0HmU9D1CYCpDZD9lzZw/dwj4l6TmoR9ha478E/37PDvt+IgeOsMZLsunYFf7gVbV5DlWSZjdDRo5TKWgdQkNCaVi8E7hbPzmQ0SB8H3vSH2db5z5HG83znOvDJWWTv69uwAcIBACCGEoHkglKzocr8OFCXgAIEQQggBaGIQcICQytFekLStQVyOXCFTfaYg7ZzO3lOdMYfboyxrikpXv73HCUf9TAze6zK0chCs/odDCf8GbFczaUbQ113mB1lXpqCWZgOXq6I0T1jlrQy17BdmWrro6UizgXSD1NuWU/8uM0IqUza7TA4N0vwQlaGXw5515XF110YrDLN4HoI8S/I5hMPN0WUyDPTekOtJvJ+Soh392m6PcIBACCGEgF4MEg4QCCGEEIAmBgEDJRFCCCHEgjMIfhjuPdKn0Fx1pXAOkk7V5Y4k111lABKke1ba325baEyzq0bDwv1TdDKitRsNm52QYWllSufWIm3csbDpfqjbx3OFa6J0e3StuzQHslyGS5YunbqOQGox5GVprebAD5cmQdrHrRDUlgbBO9Sy1Abo+oUgGgS/lM0uV0apOZCui7ujmjtl1Ftz0Nx/b7dfy+1RahK0db/nDsbzLVwVk3gXBEkxn9y7THfv3r9+TtPEYMIBAiGEEALQxCDgAIEQQggBZxAk1CAQQgghxIIzCBKZblS3ofnY9ILFNvCOT+Dnv+wKkSr3tdzudRtzVNhCZawAbV3aVMNCk9AU1bQawmYv8St3EdNs3jlCc+Cqa8VxkLENwo7YBuKiSg2Crqmw4h44Ujq70lzLuqlEhlPWcWkMEpZr6zFRN4gGQdrw9fImqU+wNAginbgjfLKuOQBMnYEdWjnsWdeKe+CnQdDuPyWeO/kcGs9oAF1BkPeGbNt6HyWTGtpIQS3fcxn+85omBgMOEAghhJD/0Z5MBMlCEwMhhBCSRubNm4e+ffsiLy8PJSUlWLt2rbP+0qVLMWDAAOTl5WHw4MFYvnx5vKyxsRHf//73MXjwYHTu3Bm9evXCuHHj8MknnwTuF2cQknHDsTI/ynVvs4HT5chvWtHI9uZtqgAAMRsOFVGedZWYFlWaGcEKuetwewxF3dfUe4Lbnxy116xghbMV09+6u1uWMGs0hc0Lk6XMdd0EId0RLRNDyGFiEPONermfu2dbZXeU4ZJ1pJlA1nWVy8/DDr0c8ixzmRFkBkZpYpCmAWf45Kj3vn5ujrpZIYhbI2CaFeRz5gqXHpLmhyRcIoNkgnSaMix379S9Q9OOUsn3KeD+S5YsQWVlJebPn4+SkhLMmTMH5eXl2LRpE3r27GnVX716NcaOHYuqqiqce+65WLRoESoqKrBhwwYMGjQIX3zxBTZs2IBbbrkFxx9/PP773/9iypQpOP/887Fu3bpAfeMMAiGEEIK9XgzJLkGYPXs2rrrqKkyYMAHHHHMM5s+fjwMOOACPPPJIwvr3338/zj77bEydOhUDBw7EbbfdhhNPPBFz584FABQUFGDlypW49NJLcfTRR+Pkk0/G3LlzsX79emzevDlQ3zhAIIQQQlJMXV2dsdTX11t1GhoasH79epSVlcW3hcNhlJWVYc2aNQnbXbNmjVEfAMrLyz3rA8DOnTsRCoXQrVu3QOfAAQIhhBAC7PViSHYB0Lt3bxQUFMSXqqoq63Dbt29HNBpFYWGhsb2wsBA1NTUJu1hTUxOo/u7du/H9738fY8eORX5+vv810KAGQWK55XiXBXFzDBQ+2a9dV3hVS3MgyzVbqBweCj2DbiuNiQNFpW0UrXddNDyopK7AcrPT3ByFbsByZTQ0CDHPsuZyb42C1Ao0Cv2CK3yyXHeFT7ZCLzvw0ye4dAYSed2MdqxQy96fh6wrQyLrn6XUEbh0BrLMSrXs0CS4UjY3l4c9y6Qro+Hm2CRcOMXzINOJG7oDn3Dohu7A5/k2bgM/N0eXu3QQF24/N0eHa3jGaQ4EoVgC7UYr2gCALVu2GF/Iubm5yTXcChobG3HppZdCKYWHHnoo8P4cIBBCCCEpJj8/3/cXe48ePRCJRFBbW2tsr62tRVFRUcJ9ioqKWlR/z+Dgo48+wrPPPht49gCgiYEQQghpJoUmhpaQk5ODIUOGoLq6Or4tFouhuroapaWlCfcpLS016gPAypUrjfp7BgfvvvsunnnmGXTv3r3lndLgDAIhhBCC9ORiqKysxPjx4zF06FCcdNJJmDNnDnbt2oUJEyYAAMaNG4dDDz00rmGYMmUKRowYgXvvvRcjR47E4sWLsW7dOixYsABA8+DgkksuwYYNG/Dkk08iGo3G9QkHHXQQcnJyWty3DjlAUHoK5wD72SFFhSbB0hVo5dLOG0RXECTFq7QPSq1A2ONvACok7Kb6qiiLWeGSo1rV1E1MWTbviHf45CypK4jtvThZQjdgaxDMC6mH782WsQ2Eb70eMjkiNQiO9M9+moNMSPdspdS24iB4p3u24yKEPeu6dAZSY+CnSWh0xDaIyj45widb++rpz6XmQNSV4ZSN9ahDcyDWrbIgOgLfVPB6B0WZdRztnWm146PNCoBKt0YhDXEQRo8ejW3btmHGjBmoqalBcXExVqxYERcibt68GeHw3ntv+PDhWLRoEW6++WZMnz4d/fv3x7JlyzBo0CAAwMcff4zHH38cAFBcXGwc67nnnsPpp5/e4r51yAECIYQQkilMnjwZkydPTli2atUqa9uoUaMwatSohPX79u2bsoEWBwiEEEIImO5ZwgFCTMyXucInB3RzNDOtSXOEDIvqHQLZaWKQU5AyBLKcTdZm2i1POJHN0agrGpJuj/qBmkSSRem6KNHLZd1I2DyO4VYXNvuUHZHhkjUTgzjZsPg8soT/WJZ23AYfs4FuvpAmBom+r5+JwS/bY2uR0/tmmdvNVKJP2bvcGmXblquiIyyzFdZYukRK90TDPCH2lcd1hE92uTLK7I0xy6QgrrHhuuj9nAGmK6OfG7NhjghiUoDbbGC9r1rp5ugbllm+f9NNQJGhZxvtBHoxEEIIIcSCMwiEEEIIaGKQcIBACCGEAGnxYshkOEDww9AgyDJzVdrtdD/BQOlU/eyOEUddPzukbrOUBiYfT0yzTLq/aUSk3VqcgAjLrLT60g0tS+giYo660oas6wiklkG6NTYIt019X6kVkHqFsGZ799cVaBoEH2NlkNDLQXCFVnbpBvzaskNdt1xXILUnuiujpRuwNAnC9VLXIETd++paApmy2eXKaGkOmsTD1CR1BtpzJ8qcbo7JuDy7wjLD553jChtvvee867anL8uOCAcIhBBCCGhikHCAQAghhAD0YhDQi4EQQgghFpxBkDj8dqVPr+3ja64GCoMaTfw3YGoOrHZlXWGzl3ERdBOz3FeGU9brWqZoGetAG2vGlHlyStiilbBh6qlxI0K/oCLe9mWpK4iIc21yaBCskMgyLbNDgxAWj01I1xX4tBtEgyBpbVwEV9wDq66PBsG1HiRVt9QVyHajjrr2uvc9YrVr6Qy0ulGpT/AOl2zFOZCaA0cKZ1tzYO7qfL4d+wZ5xwTe1xGW2fle9IuDkGHQxGDCAQIhhBACNOeVkCLM1rTRTuAAgRBCCAGoQRBQg0AIIYQQC84gBLGJ+fj/WrEOdP2CK/eCKPfN26DbDsUQz0+ToHcyZMXZl9fC2wdeyWzPepm0eYtrHIsIjYI2TlXiXKUdOKzpDGQuhrClMwh7l4XdWgFdgyCvgktXEAqgQZAE1SSkCle+BT8NgnLEQbDqan/7ahC0z13mPZBxD6y8CMa+MpaB93HtFM0iVoMjZbNvCmdNoxAS+h07LoKjnSB6Bb/8CrGWlQHiXeYTDybQFHuGaRJCSIEGISU9yQw4QCCEEEIARlIU0MRACCGEEIuOOYPgSDEqp9p0jz3LhBCV03JiPRrAbBAkZGo48d+A7akoLQz6YWVda9rUmDt0x2FWrjK5LtICh7TPQ0WEOUJMJxvT+dJMIEwOUd1VUZRJU4B0eww5zAbSPOHVv0T7ukwM6ZqadP3ecZkUEpXrSPdDV1pvaTYwTBeW2cnHHVE3Mch2g7guOsKUW26MfuGTmxxljuc9LM0RLldFR1nC4zjdsOW7zFXmSA3t065FmtM/083RJK0zCNFoFLfccgv69euHTp064cgjj8Rtt90GpX2jKKUwY8YMHHLIIejUqRPKysrw7rvvprHXhBBC2iUqRUs7Ia0DhLvvvhsPPfQQ5s6di7feegt333037rnnHjz44IPxOvfccw8eeOABzJ8/Hy+//DI6d+6M8vJy7N69O409J4QQQto3aTUxrF69GhdccAFGjhwJAOjbty9++9vfYu3atQCaZw/mzJmDm2++GRdccAEA4Je//CUKCwuxbNkyjBkzJm19J4QQ0r4IKWVHyG1FG+2FtA4Qhg8fjgULFuCdd97BV77yFbz++ut48cUXMXv2bADAhx9+iJqaGpSVlcX3KSgoQElJCdasWZOSAYLyCZ8cEuYOsbO5bukMXG6O8Fy3NQeiXU1YIDUILs0BAIQ04YF0q7Osf4b9Vp67Q5MgwyXL6yTOR8V0N0d5rqKuti7PPSbt//p1ktoMGZbZoR2QdaWuwKUd8NMktLSsLZF6AFeZS3Ngeb9Z7ojeGgR3XdGuT6poXTdkaQ7kA+HQFbjCJcsM5r7uiLqbo3jQLJ2BXle0Ew6kQfDWEch++Ida1tqy3L291+1w9OJ5zrQv0xgSvAhb0UY7Ia0DhJtuugl1dXUYMGAAIpEIotEo7rjjDlx22WUAgJqaGgBAYWGhsV9hYWG8TFJfX4/6+vr4el1dXRv1nhBCCGm/pFWD8Lvf/Q6/+c1vsGjRImzYsAELFy7Ej3/8YyxcuLDVbVZVVaGgoCC+9O7dO4U9JoQQ0l7ZY2JIdmkvpHWAMHXqVNx0000YM2YMBg8ejMsvvxw33HADqqqqAABFRUUAgNraWmO/2traeJlk2rRp2LlzZ3zZsmVL254EIYSQ9gG9GAzSamL44osvLP/0SCSC2P98Yfv164eioiJUV1ejuLgYQLPJ4OWXX8bVV1+dsM3c3Fzk5uamrpOO1KVWXARpe3KGMpU2S93mLQ3mokuOOAjSIG7Z3o3uiRgD4s7WwykreNt55boskzY5K0yzfr7CbmpFbdb1AJY2w1uDYF0XWVd0KeSIt2BpEBwiBLuuS4Pg3U5b4vrB46cVcLVjawMcGgTZlv58WBoEH11BzKUrkAcKeZbZugJvbUCQ2AYufQJgahJ8Yxs42pV6BVu/oGukRJnUGbj0Crb4JPHf+wOMpGiQ1gHCeeedhzvuuAOHH344jj32WLz66quYPXs2rrzySgDNgrrrr78et99+O/r3749+/frhlltuQa9evVBRUZHOrhNCCCHtmrQOEB588EHccsstuOaaa7B161b06tUL3/nOdzBjxox4nRtvvBG7du3Ct7/9bezYsQOnnnoqVqxYgby8vDT2nBBCSHuDkRRN0jpA6Nq1K+bMmYM5c+Z41gmFQrj11ltx6623tk0nArjsWNOTDrdGuW5PV4q6EW83KGvqUJ/yFvPSsovSAhFzlNkubUahWVmaCRxTtX5Tt0Z4ZWFeUTKssX6+0gVSel4a10k0Y7Ur1/VDepfJLsl2XFaDwG6NrX3zOMwCVlWfulYPjPDJ7spG21Zdh9lA1pVmA1e5ZQb0NjnI+9J13/q6BTpMEEHCJ9sukOa6Xh4O4NYo1/1dIlXCvwHY71D9OAFdw9MOTQwGTNZECCGEEIuOmayJEEIIEYRiCcTmrWijvcABAiGEEALQxCDomAMEt1+XuW7Y3syhoSssMyDdiNxujroLkrS7h4TOIOSwj4cDaBL8zIF6N2zXMm93ROnGqCzNgVkeMs5ddlj6aTr0CtJGL/d11hUVtHLLLG+tt9J10U9T0FZuj67D+mkQguzr0iTIui73Q4nlZudoK0CIczu0sjyOo8zXRdJ7X2f4ZKk5cLkq+mobxLvCSOEs6jpSOvu+9/T3pJ/GS9KOvlzbAx1zgEAIIYRIUhHoqB2NcThAIIQQQoCUhEpmqGVCCCGEtGs4gyDjArtsZg6NAQArTHAootc1q4abvG34Ukdg++h7hxCOifmtsIxtYBxU9Ml16lZoZRmvQC/zCZdsCSM0X3orloGsq5VZsQ2kJkHfz3ENAes6GhoFPw2CA0vrEERXkA4Ngl/dADEVXBoESzfg0itIbYAV9wDe5X4aBKOuKHPGDWh5aGV7X5+6rjgIUkdgxEEw68q4CK625PvIqbGwYia0/J1pv18zTPJPkaIBBwiEEEII0DwwTXbM0n7GBxwgEEIIIQA1CBIOECSBQi0Lt8dYWKw73Bxdrk52akHZSe/KVvflBm0635GRUa5brouyrj71L90aHWaC5nLlWdfaN+RtjrAuRdi7zDYpyMN4m3Hs4zpeCM5Uj95FacPv3RbAzdHO8ufdjruuezrf2ZYVatl73RWG2a7b8nYBt5uj08Qgp/Mdbo/STCBNCpbJQXddlMdxhY23QitLM632t1+oZZLRUKRICCGEAP9zc1RJLsEPO2/ePPTt2xd5eXkoKSnB2rVrnfWXLl2KAQMGIC8vD4MHD8by5cuN8j/+8Y8466yz0L17d4RCIbz22mvBOwUOEAghhJBmkh4cBBc5LlmyBJWVlZg5cyY2bNiA448/HuXl5di6dWvC+qtXr8bYsWMxceJEvPrqq6ioqEBFRQU2btwYr7Nr1y6ceuqpuPvuu5O6HBwgEEIIIWli9uzZuOqqqzBhwgQcc8wxmD9/Pg444AA88sgjCevff//9OPvsszF16lQMHDgQt912G0488UTMnTs3Xufyyy/HjBkzUFZWllTfqEHwsZGFonrYUGFriwrNQZPQJGhud9IFz/Kyawp5l8lwyobx2ltjANinp9sP5enY4ZS1v4Wd1NIKRBxllo5Aljvs/a62xHWxtAGGS6TbrdEp5fDTCrh0EVbdAL8uMsLN0d0Jl73fdVyrVadLpChzuSoCRp/9tAHGcfy0DS4NQqDUynJfqQ1w1YWoq7squtu12mpy1JVuj9q7zXrPWfoFrW5UvmQyXJMQQ/LP3f9Oua6uzticm5uL3NxcY1tDQwPWr1+PadOmxbeFw2GUlZVhzZo1CZtfs2YNKisrjW3l5eVYtmxZkh234QwCIYQQgr1eDMkuANC7d28UFBTEl6qqKut427dvRzQaRWFhobG9sLAQNTU1CftYU1MTqH4ycAaBEEIISTFbtmxBfn5+fF3OHuwPcIBACCGEACmNpJifn28MEBLRo0cPRCIR1NbWGttra2tRVFSUcJ+ioqJA9ZOhYw4QXOlILcO8Vi7taQHiIITlviFh3XHapqWuQA9lKo3nwi4vNQlGeluxqwyRbKRhdqdsNjQKPhoEp1bAr25IL2u5rsBXBxEgLbO7rs+6w8AZJIpxKgkii3CGRPZr13GCrjgIftqAQHEQXHERfLQNzrq+mgTV4rrONMzOUMs+sVYa5b4q4d/Nbcl3W4A4CPq+Vqhln9D2snxfs49DLefk5GDIkCGorq5GRUUFACAWi6G6uhqTJ09OuE9paSmqq6tx/fXXx7etXLkSpaWlyfQ6IR1zgEAIIYRkAJWVlRg/fjyGDh2Kk046CXPmzMGuXbswYcIEAMC4ceNw6KGHxjUMU6ZMwYgRI3Dvvfdi5MiRWLx4MdatW4cFCxbE2/zPf/6DzZs345NPPgEAbNq0CUDz7EOQmQYOEAghhBBgn88gAMDo0aOxbds2zJgxAzU1NSguLsaKFSviQsTNmzcjHN47BTp8+HAsWrQIN998M6ZPn47+/ftj2bJlGDRoULzO448/Hh9gAMCYMWMAADNnzsSsWbNa3LeQsmLxti/q6upQUFCA03EBskLZAIBwXl68PNSpk1E/lCeEJNq6ysk2ilSuOb5SOeZ6LGfvPLzKNue4Y1liXSuPZYkMjNne0/uxiKgrhnxKlOtT7TFpJpDrxtS/j4lBP519ZmLwLrPqZoyJwRuaGBK3SxODXreNTAyNMVEmTAxaebjBbDjUYPpXhuqbtLJGsxO7641VJde//DL+d2z37vjfTaoRq/AYdu7c6WvXbw17vifOPPp7yIokJyZsitajetO9bdbXfQlnECQuP12fdM/K8iXWnZ9lHARRV3sThH28T5XzBSgGDI7UyzL2vCvWgRLpkq0BgvFlLL4IggwYggwQgnzpBxkQWPUdaaQTtN3iMh/aasAQaEAgce3r82Xc4nbkvn7tur7I/faNeZdZAxMjDoJ4fuW+rnTPvoML78GETOlspGz2y9vgim0QIA5CUumeM/z3KJM1mTAOAiGEEEIsOINACCGEAGnRIGQyHCCIvMVSkuEMtSzdHKPS6Kf/7Q61rJsVlJVLWboqaqFkxVS/1CDIqU5dkyBNIq6wxpYGwVlXzrd61wV8zBNJaBBcJoZgGoTW1w1cnmkECJ8s8TMFtLhuUBODK/yzZUbQpvP9TAwOXYT/ukOD4AzLLMMYm3V1s4EdWtlbcyDL7fDJ3uvWe871Xoy6369W3vh0E1NJ2uBgu27ux9DEQAghhBALziAQQgghAE0MAg4QCCGEEABACgYIgdKlZjYdcoCg28HssKHebjnSLqfCMr2zDJ/s7eYobTumZ5DbaG/Uddg6m3eV8QuUd5mlK9D0CtLNMQkdgfP0/GIOBHFdDBIzQWCEcU5CV5BSV8XWtpXC91UyrotmCmefykZd93FSpV+wtADOuj5uji5dgdzXpVdwxFOQ5VaZX/jkJu93myuls+XW6NAr2KGW3evtPCzPfkeHHCAQQgghFjQxGHCAQAghhAD/m9GgF8Me6MVACCGEEIsOP4NgxT2QRn3d5zcixlPS/7dJxCh3H1i0pQsLzOPIEKpKSyvtqyOwcjFo65auwKFXCLmPY9r73e0mFRI5QLpnZxwEga0V0A3OQfdt+XEDkQEahECxDFK1b+A4CMpR5r2vfwhn75gJznDPok9+ugJnSGdHXARbg+CdslmW23EPRN1GrdNNQeIgyEAsPnER0o2KJR+bIdNiOyRBhx8gEEIIIQCoQRBwgEAIIYQA1CAIOuYAwfUBitGfijmm4cRcoeu2sGewWz6taE39a+XW9L00KTR5mxgsM4FlrtDqWn5c8Kxrl/ns63ApdJsYfB7EkN5/d9WkXBX3g5TOrSWpVNBB2goUhtl9oNZmgrRcL11mA4f5we+4fq7VTrOB7KOR+TGYicHYV5gCLFdG3awg60qTg/aeVNL84Pfruh19ubYHOuYAgRBCCJHQxGDAAQIhhBACNM/8JD1ASElPMgK6ORJCCCHEgjMI0kYm3XJ0+7gMpSyQ5mVjICndKWNmW7rNT7omyhDOStdCyDKpQbDySjvs8tKVMeLSBni7GFrtSm2D47iBQiL79SmIq6Lrow2kMWhDkUEmuDkKfEMmt7AfVmrlFu6XsA+tdZm0XJ7FvkHcHB19suz7ruP6aBCMtqz081Lr4Ci33oPerouW5sDSIHjrFax1edx0QxODAQcIhBBCCPC/AUuSg5ZMG/QkAU0MhBBCCLHgDAIhhBAC0MQg6JgDBD0Upl86Ut2nNxQglDKEvVBqBYQGQS8PidgFVohnva2w6JMVElnua1QWHXZoBSwdgSPMsaudRMf16l+i43gdMwHJ7esuN5CxKFJEW8VMCBTbIAgBfNiTC8vss3OQfZ3aB4c2wC9mguO94hvXQV+3UkE74gr41ZW6AuXSL7jCJ7t1W8qImSDbcesv0h6mmAMEA5oYCCGEEGLRMWcQCCGEEAlDLRtwgCCm1pQMI+rYVcnpMGuaTpugiUTMMpcZwWfqP0jdkJVJMeRZV07Jh5yuf97t+rr6tbJdSVuaAVrtrrifhVJOmla+CwO5RwZ84bpDOvtMcRvHdR3Db6q85e062/IzgTrqWmYC13H86mrvRSt8suXK6J3NUb5fM03xr1TMfq+3oo32AgcIhBBCCNA8MEp2BoAaBEIIIYS0ZziDQAghhAD/+/XPGYQ9dMgBgp4uWdreXOGS7ZTNbrudYceW4UiFTTzk0AZIF0l3XR8bvsO2brtIutwEW95OkH0DaQWC6ASSCIHcpuGTddI1n7ePTKaBdAc6QfdLlb7B1Y6vq6V3uZ0aOsBxXJoE37re7yvlq3VwuIZbugKtXZ9Qy0q8f1W6BX6xmE/c7xbQjjQINDEQQgghxKJDziAQQgghFjQxGHCAQAghhKDZhVMlaWKgm+P+jmFPE3Z3me1ZL5MjQ2mblr7ERlW3VkC5gg746QqMMh+rkcPGL/sYMgvd7RrHCGi52kdaAoMAWoc2UyDsK21DEDLl10+qbNGB0lEH0S4E/BJwtG29V4zj+GkdHP3w0xW42hF13X1seQhnqTmwdVzt58u1PdAxBwiEEEKIhCYGAw4QCCGEEKB55iTZbGbtaIBALwZCCCGEWHT4GQTb7zYqK3jvHMDeL4/iGyvAaCeJcVyA41jj3mSOa3RhX8URyECbPml79pHvvNMOH4Rk8g8k04cAx20rXYT1vs00zYFSSDowSDuaQejwAwRCCCEEaB7AqCRNDCkbSGYANDEQQgghQPOMRiqWgMybNw99+/ZFXl4eSkpKsHbtWmf9pUuXYsCAAcjLy8PgwYOxfPly8zSUwowZM3DIIYegU6dOKCsrw7vvvhu4Xx1zBsFIkRr1roe2mwFrP2NMQgghrWXJkiWorKzE/PnzUVJSgjlz5qC8vBybNm1Cz549rfqrV6/G2LFjUVVVhXPPPReLFi1CRUUFNmzYgEGDBgEA7rnnHjzwwANYuHAh+vXrh1tuuQXl5eX4xz/+gby8vBb3LaTa03xIAurq6lBQUIDTcQGyQtnp7g4hhJCANKlGrMJj2LlzJ/Lz81Pefvx7InRh0t8TTaoRq9SfWtzXkpISDBs2DHPnzgUAxGIx9O7dG9deey1uuukmq/7o0aOxa9cuPPnkk/FtJ598MoqLizF//nwopdCrVy9873vfw//93/8BAHbu3InCwkL84he/wJgxY1p8LjQxEEIIIUBKTQx1dXXGUl9fbx2uoaEB69evR1lZWXxbOBxGWVkZ1qxZk7CLa9asMeoDQHl5ebz+hx9+iJqaGqNOQUEBSkpKPNv0ot2bGPZMkDShkfP6hBCyH9KERgBtLwBMxffEnr727t3b2D5z5kzMmjXL2LZ9+3ZEo1EUFhYa2wsLC/H2228nbL+mpiZh/Zqamnj5nm1edVpKux8gfPbZZwCAF7HcpyYhhJBM5rPPPkNBQUHK283JyUFRURFerEnN90RRURFef/11w96fm5ubkrb3Je1+gNCrVy9s2bIFSikcfvjh2LJlS5vYsNoLdXV16N27N6+TD7xOLYPXyR9eI3+UUvjss8/Qq1evNmk/Ly8PH374IRoaGlLSXk5OTovEgD169EAkEkFtba2xvba2FkVFRQn3KSoqctbf839tbS0OOeQQo05xcXGQ02j/A4RwOIzDDjsMdXV1AID8/Hw+hC2A16ll8Dq1DF4nf3iN3LTFzIFOXl5eIIV/KsjJycGQIUNQXV2NiooKAM0ixerqakyePDnhPqWlpaiursb1118f37Zy5UqUlpYCAPr164eioiJUV1fHBwR1dXV4+eWXcfXVVwfqX7sfIBBCCCGZSmVlJcaPH4+hQ4fipJNOwpw5c7Br1y5MmDABADBu3DgceuihqKqqAgBMmTIFI0aMwL333ouRI0di8eLFWLduHRYsWACgOXLt9ddfj9tvvx39+/ePuzn26tUrPghpKRwgEEIIIWli9OjR2LZtG2bMmIGamhoUFxdjxYoVcZHh5s2bEdbC3g8fPhyLFi3CzTffjOnTp6N///5YtmxZPAYCANx4443YtWsXvv3tb2PHjh049dRTsWLFisAzJO0+DsIe6uvrUVVVhWnTpu2XYpF9Ba9Ty+B1ahm8Tv7wGpFMpcMMEAghhBDSchgoiRBCCCEWHCAQQgghxIIDBEIIIYRYcIBACCGEEIsOMUAImmu7vVNVVYVhw4aha9eu6NmzJyoqKrBp0yajzu7duzFp0iR0794dXbp0wcUXX2xF7+po3HXXXXEf4z3wOjXz8ccf45vf/Ca6d++OTp06YfDgwVi3bl28PFX56fdnotEobrnlFvTr1w+dOnXCkUceidtuu83IL8DrRDIK1c5ZvHixysnJUY888oj6+9//rq666irVrVs3VVtbm+6upY3y8nL16KOPqo0bN6rXXntNff3rX1eHH364+vzzz+N1vvvd76revXur6upqtW7dOnXyySer4cOHp7HX6WXt2rWqb9++6rjjjlNTpkyJb+d1Uuo///mP6tOnj7riiivUyy+/rD744AP11FNPqffeey9e56677lIFBQVq2bJl6vXXX1fnn3++6tevn/ryyy/T2PN9yx133KG6d++unnzySfXhhx+qpUuXqi5duqj7778/XofXiWQS7X6AcNJJJ6lJkybF16PRqOrVq5eqqqpKY68yi61btyoA6vnnn1dKKbVjxw6VnZ2tli5dGq/z1ltvKQBqzZo16epm2vjss89U//791cqVK9WIESPiAwRep2a+//3vq1NPPdWzPBaLqaKiIvWjH/0ovm3Hjh0qNzdX/fa3v90XXcwIRo4cqa688kpj20UXXaQuu+wypRSvE8k82rWJoTW5tjsiO3fuBAAcdNBBAID169ejsbHRuG4DBgzA4Ycf3iGv26RJkzBy5EgrBzuvUzOPP/44hg4dilGjRqFnz5444YQT8PDDD8fLU5mffn9m+PDhqK6uxjvvvAMAeP311/Hiiy/inHPOAcDrRDKPdh1quTW5tjsasVgM119/PU455ZR4qM6amhrk5OSgW7duRt3W5BPf31m8eDE2bNiAV155xSrjdWrmgw8+wEMPPYTKykpMnz4dr7zyCq677jrk5ORg/PjxKc1Pvz9z0003oa6uDgMGDEAkEkE0GsUdd9yByy67DAB4nUjG0a4HCMSfSZMmYePGjXjxxRfT3ZWMY8uWLZgyZQpWrly5z7O87U/EYjEMHToUd955JwDghBNOwMaNGzF//nyMHz8+zb3LHH73u9/hN7/5DRYtWoRjjz0Wr732Gq6//nr06tWL14lkJO3axNCaXNsdicmTJ+PJJ5/Ec889h8MOOyy+vaioCA0NDdixY4dRv6Ndt/Xr12Pr1q048cQTkZWVhaysLDz//PN44IEHkJWVhcLCQl4nAIcccgiOOeYYY9vAgQOxefNmAGZ+ep2Odp2mTp2Km266CWPGjMHgwYNx+eWX44Ybbohn6eN1IplGux4g6Lm297An1/ae3NkdEaUUJk+ejD/96U949tln0a9fP6N8yJAhyM7ONq7bpk2bsHnz5g513c4880y8+eabeO211+LL0KFDcdlll8X/5nUCTjnlFMtN9p133kGfPn0AmPnp97AnP31Huk5ffPGFkZUPACKRCGKxGABeJ5KBpFsl2dYsXrxY5ebmql/84hfqH//4h/r2t7+tunXrpmpqatLdtbRx9dVXq4KCArVq1Sr16aefxpcvvvgiXue73/2uOvzww9Wzzz6r1q1bp0pLS1VpaWkae50Z6F4MSvE6KdXsApqVlaXuuOMO9e6776rf/OY36oADDlC//vWv43Xuuusu1a1bN/XYY4+pN954Q11wwQUdzn1v/Pjx6tBDD427Of7xj39UPXr0UDfeeGO8Dq8TySTa/QBBKaUefPBBdfjhh6ucnBx10kknqZdeeindXUorABIujz76aLzOl19+qa655hp14IEHqgMOOEBdeOGF6tNPP01fpzMEOUDgdWrmiSeeUIMGDVK5ublqwIABasGCBUZ5LBZTt9xyiyosLFS5ubnqzDPPVJs2bUpTb9NDXV2dmjJlijr88MNVXl6eOuKII9QPfvADVV9fH6/D60QyCaZ7JoQQQohFu9YgEEIIIaR1cIBACCGEEAsOEAghhBBiwQECIYQQQiw4QCCEEEKIBQcIhBBCCLHgAIEQQgghFhwgEEIIIcSCAwRCCCGEWHCAQAghhBALDhAI2Q/Ztm0bioqKcOedd8a3rV69Gjk5OUY2QEIIaS3MxUDIfsry5ctRUVGB1atX4+ijj0ZxcTEuuOACzJ49O91dI4S0AzhAIGQ/ZtKkSXjmmWcwdOhQvPnmm3jllVeQm5ub7m4RQtoBHCAQsh/z5ZdfYtCgQdiyZQvWr1+PwYMHp7tLhJB2AjUIhOzHvP/++/jkk08Qi8Xwz3/+M93dIYS0IziDQMh+SkNDA0466SQUFxfj6KOPxpw5c/Dmm2+iZ8+e6e4aIaQdwAECIfspU6dOxe9//3u8/vrr6NKlC0aMGIGCggI8+eST6e4aIaQdQBMDIfshq1atwpw5c/CrX/0K+fn5CIfD+NWvfoW//vWveOihh9LdPUJIO4AzCIQQQgix4AwCIYQQQiw4QCCEEEKIBQcIhBBCCLHgAIEQQgghFhwgEEIIIcSCAwRCCCGEWHCAQAghhBALDhAIIYQQYsEBAiGEEEIsOEAghBBCiAUHCIQQQgix4ACBEEIIIRb/H4ofQe8PMMi/AAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Assuming x_cond contains the solution obtained with preconditioning\n",
"solution = x.reshape(N, N)\n",
"\n",
"plt.imshow(solution, cmap='viridis')\n",
"plt.colorbar()\n",
"plt.title('Solution of the Poisson Equation')\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SQLaKyCwOX7d"
},
"source": [
"##Sparse Approximate Inverse"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Xzy2J626Ob-_"
},
"source": [
"Sparse approximate inverse is another tool that attempts to find $P^{-1}$ so as to minimize the Frobenius norm of\n",
"\n",
"$||I-AP^{-1}||$\n",
"\n",
"It generates successive iterations of the preconditioner with increasing density."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "AfVY7WGKOyrw"
},
"outputs": [],
"source": [
"def spai(A, m):\n",
" \"\"\"Perform m step of the SPAI iteration.\"\"\"\n",
" from scipy.sparse import identity\n",
" from scipy.sparse import diags\n",
" from scipy.sparse.linalg import onenormest\n",
"\n",
" n = A.shape[0]\n",
"\n",
" ident = identity(n, format='csr')\n",
" alpha = 2 / onenormest(A @ A.T)\n",
" M = alpha * A\n",
"\n",
" for index in range(m):\n",
" C = A @ M\n",
" G = ident - C\n",
" AG = A @ G\n",
" trace = (G.T @ AG).diagonal().sum()\n",
" alpha = trace / np.linalg.norm(AG.data)**2\n",
" M = M + alpha * G\n",
"\n",
" return M"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-0FU0jusnXEH"
},
"source": [
"Note the demonstrative example is for a different matrix."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "INnqcyXaPHqz",
"outputId": "b7b990eb-9972-4d02-8521-25f1fa412796"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unconditioned condition number : 3961.9652414685806\n",
"Preconditioned condition number : 40.18659718436124\n"
]
}
],
"source": [
"import numpy as np\n",
"from scipy.sparse import diags\n",
"\n",
"n = 1000\n",
"\n",
"data = [2.001 * np.ones(n),\n",
" -1. * np.ones(n - 1),\n",
" -1. * np.ones(n - 1)]\n",
"\n",
"offsets = [0, 1, -1]\n",
"\n",
"A = diags(data, offsets=offsets, shape=(n, n), format='csr')\n",
"\n",
"M = spai(A, 50)\n",
"\n",
"print('Unconditioned condition number :', np.linalg.cond(A.todense()))\n",
"print('Preconditioned condition number :', np.linalg.cond(A.todense() @ M.todense()))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 751
},
"id": "MyXry66CPzCZ",
"outputId": "66657aa5-58ba-4cef-d4c0-0dd153ebf4c7"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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KTY2Vi1atKAAAwCAAofyC7tixYrpp59+UkhIiL0A79+/33QsAACAXEP5RSaBgYFasWIFBRgAABRIlF9c468FOCYmRi1atNCJEydMxwIAALhtzPOL68oowK1atVLNmjVVrlw505EAAABuG+UXNxQYGKjVq1fLx8dH7u7upuMAAADcNoY94KaKFSsmLy8vSekLYgwcOFDfffed4VQAAAC3hvKLbJs+fbqmT5+uhx56SHPmzDEdBwAAIMcov8i2fv36qUePHrp69ap69eql0aNHi9WxAQCAM6H8Its8PT01a9YsDR06VJL00ksvadCgQbp69arhZAAAANlD+UWOuLm5ady4cZo4caJsNpumTZumLl26KDEx0XQ0AACALFF+cUueeeYZffXVVypUqJCWLVumvXv3mo4EAACQJaY6wy3r0qWLVqxYoZiYGIWHh5uOAwAAkCXKL27L3Xffnel5VFSUzp49qzZt2hhKBAAAcGMMe0CuiY2NVYcOHdS+fXtNmTLFdBwAAIBrUH6Ra4oWLaqWLVsqNTVVgwcP1qBBg5SSkmI6FgAAgB3lF7nG29tbM2bM0LvvviubzaapU6eqffv2On/+vOloAAAAkii/yGU2m00vvPCCFi5cKB8fH61YsUKNGzfWr7/+ajoaAAAA5Rd5o2PHjvrll18UFBSkQ4cO6c033zQdCQAAgPKLvBMSEqKtW7eqf//+mjZtmuk4AAAAlF/krRIlSuiTTz5RQECAJMmyLP3f//0f44ABAIARlF/kqylTpigyMlINGjTQzp07TccBAAAuhvKLfNW0aVNVrlxZR48eVUREhL744gvTkQAAgAuh/CJfhYaGauvWrbrvvvt06dIlde/eXc8++6yuXLliOhoAAHABlF/ku+LFi+uHH37QiBEjJEmTJk1Ss2bNdOLECcPJAABAQUf5hRHu7u565513tHjxYhUtWlRbtmzR0aNHTccCAAAFnIfpAHBtHTp00Pbt27Vu3To1b97cdBwAAFDAceYXxlWuXFm9evWyP9+/f786duyomJgYg6kAAEBBRPmFQ7EsS/369dO3336runXras2aNaYjAQCAAoTyC4dis9n02WefqXbt2oqJiVHLli01evRopaWlmY4GAAAKAMovHM5dd92lTZs2qXfv3kpLS9NLL72k9u3bKzY21nQ0AADg5Ci/cEg+Pj6aMWOGpk+f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Hz+uFStWaMCAAQoICMiLjMiGo0clX9/0BS8YtgYAOVOzZk117tzZ/nzlypWqUaOGVq9ebSwTgLyR4/LbqlUr7d69Wzt27NCwYcNUrly5vMiFHCpfXkpJkRITpZMnTacBAOf25ptv6tixY2rZsqWGDRumy5cvm44EIJfkuPy+/fbbqlWrVl5kwW3w9PzfMsf79pnNAgDObvHixXrsscdkWZbee+89hYeHa9euXaZjAcgF2VreODIyUm+++aZ8fHwUGRl5033Hjx+fK8GQczVrSr/+mn5r29Z0GgBwXn5+fvr444/VoUMHDRw4ULt371aDBg301ltvaejQoXJ3dzcdEcAtylb53bFjh30mhx07duRpINy6WrWkr79OL78AgNvXsWNHNW7cWAMHDtTixYv14osvqnbt2nrggQdMRwNwi7JVfletWnXdx3AsGaNRGPYAALmnZMmSWrhwoT777DOtW7dO999/v+lIAG5Djsf89u/fXxcvXrxme2Jiovr3758roXBrMsrvnj3M+AAAuclms6l///769NNPZbPZJEnnzp3TwIEDdfbsWcPpAOREjsvvzJkzdenSpWu2X7p0SbNmzcqVULg1NWumL3P83HNScrLpNABQsD399NOaPn26goOD9f3335uOAyCbsjXsQUpfNs6yLFmWpYsXL6pQoUL211JTU/XDDz+oZMmSeRIS2ePpKS1ebDoFALiG559/Xjt37tSvv/6qBx98UP/61780btw4+fr6mo4G4Cayfea3aNGiKl68uGw2m+68804VK1bMfgsMDFT//v311FNP5WVWAAAcRt26dbVt2zYNGTJEkvThhx+qbt262rhxo+FkAG7GZlnZGx26Zs0aWZalli1b6uuvv1bx4sXtr3l5ealixYoqW7ZsngU1JT4+XgEBAYqLi5O/v7/pONkSHS0dOSLdc4/pJADgGlasWKG+ffvq999/l5ubm+bPn68uXbqYjgW4jJz0tWyX3wzHjx9XhQoV5OaW4+HCTsnZyu/+/eljf318pLg4iakoASB/XLhwQYMHD9batWu1a9cuFS1a1HQkwGXkafnNkJSUpBMnTujKlSuZtoeEhNzK2zksZyu/qalSQED6Msd79ki1a5tOBACu5ezZsypRooQkybIsffvtt3rwwQdd5qQRYEJO+lqO/ySePXtWDz74oPz8/FS7dm3VrVs30w1mubtL9eunP163zmwWAHBFGcVXkj799FN16tRJ7du316lTpwymApAhx+X3ueee04ULF7Rp0yYVLlxYS5cu1cyZM1W9enUtZqoBh9CuXfr9/PlmcwCAq0tLS1OhQoW0bNkyBQcH6z//+Y/pSIDLy/GwhzJlymjRokUKDw+Xv7+/tm7dqjvvvFOLFy/W2LFjta6AnW50tmEPkvTbb1LVqpKbm3T6tFSqlOlEAOC69u/fr549e2rbtm2SpB49emjy5MmMCQZyUZ4Oe0hMTLTP51usWDH7yjbBwcHavn37LcRFbqtSRWrQQEpLk77+2nQaAHBtd911lzZs2KBXX31Vbm5umjt3roKDg7V27VrT0QCXlOPyW6NGDR04cECSFBoaqg8//FCnTp3StGnTVKZMmVwPiFvTtWv6/e7dZnMAACRPT0+98cYbWr9+vapVq6bTp0/Lnel4ACOyvcJbhmeffVbR0dGSpJEjR6pdu3aaO3euvLy8NGPGjNzOh1vUs6d07Jj0f/9nOgkAIEPjxo21Y8cOrVixQk2aNLFvj4uLU0BAgMFkgOu45anOMiQlJWn//v0KCgpSYGBgbuVyGM445vd6zpyR1q+XHnrIdBIAwF/t379fjRs31ogRIzRs2DDOCAO3IE/H/P5dkSJFVK9evQJZfAuKlBTpnXekgQOlixdNpwEA/NWcOXMUFxen4cOH695779Vvv/1mOhJQoGXrzG9kZGS233D8+PG3FcjRFIQzv1evSnXqSAcOpJfgESNMJwIAZLAsSzNnztQzzzyjixcvytfXVxMnTlS/fv1ks9lMxwOcQq6v8NaiRYts/WCbzaaVK1dmL6WTKAjlV5LmzJF69ZKKF5eOH5d8fU0nAgD81dGjR9WnTx/9/PPPkqROnTrpo48+ss+wBODG8mV5Y1dRUMpvaqpUqZL0++/SihVSy5amEwEA/i41NVXvvfeeXnnlFaWkpGj06NEaPny46ViAw8uXMb+HDx/Wjz/+qEuXLklK/2cbOC53d6lhw/THO3eazQIAuD53d3e98MIL2rJli/r06aOhQ4eajgQUODkuv+fOnVOrVq1055136v7777dPezZgwAD+kDq4kJD0+127zOYAANxcaGioZsyYIU9PT0lScnKyunTpol9++cVwMsD55bj8DhkyRJ6enjpx4oSKFCli3961a1ctXbo0V8Mhd4WGpt9TfgHAuYwbN04LFixQ06ZN9corr+jKlSumIwFOK8fld9myZXr33XdVvnz5TNurV6+u48eP51ow5L6GDaXhw6WXXjKdBACQE4MHD1avXr2Ulpamt99+WxEREdq3b5/pWIBTynH5TUxMzHTGN8P58+fl7e2dK6GQN8qXl0aPlh5+2HQSAEBOBAQEaNasWfrPf/6j4sWLa/v27apXr54mTZqktLQ00/EAp5Lj8tu0aVPNmjXL/txmsyktLU1jx47N9pRoAAAg5/75z39q9+7datu2rS5fvqxnn32W2SCAHMrxVGd79uxRq1atVK9ePa1cuVIdO3bU3r17df78ea1fv15Vq1bNq6xGFJSpzjL8+ae0datUqJDUtKnpNACAW2FZlqZOnarXX39dGzZsUJUqVUxHAozK06nO6tSpo4MHD+qee+5Rp06dlJiYqC5dumjHjh0FrvgWRLNnS/fdJ02caDoJAOBW2Ww2DRo0SEePHs1UfOfOnas///zTYDLA8XnkZOeUlBS1a9dO06ZN08svv5xXmZCHypVLvz992mwOAMDt++s1OCtWrFDPnj1Vrlw5zZgxQ61btzaYDHBcOTrz6+npqV1ONk/WyZMnde+996pWrVoKCQnR/PnzTUcyqmzZ9HvKLwAULP7+/qpevbpOnTqlNm3a6LnnnrMvRAXgf3I87KFnz5765JNP8iJLnvDw8NCECRP066+/atmyZXruueeUmJhoOpYxfz3zy6J8AFBwNGzYUDt27NCTTz4pSZo4caLq16+v7du3G04GOJYcDXuQpKtXr+rTTz/VTz/9pPr168vHxyfT6+PHj8+1cLmhTJkyKlOmjCSpdOnSCgwM1Pnz56/J7SpKl06/T0mRzp2TAgPN5gEA5B4fHx998MEH6tChg/r37699+/apUaNGGjdunJ599lnT8QCHkOMzv3v27FG9evXk5+engwcPaseOHfZbVFRUjgOsXbtWHTp0UNmyZWWz2bRw4cJr9pkyZYoqVaqkQoUKqVGjRtq8eXOOf44kbdu2TampqapQocIt/fqCwMtLKlEi/fGpU2azAADyRvv27bV79249/PDDunr1qgI50wHY5fjM76pVq3I1QGJiokJDQ9W/f3916dLlmtfnzZunyMhITZs2TY0aNdKECRPUtm1bHThwQCVLlpQkhYWF6erVq9f82mXLlqnsfwe5nj9/Xr17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hKhq1apavXq1WrVqZTBZ/nvqqae0Z8+eTOPo8T83Oj5/Hf8dHBysMmXKqFWrVjpy5IiqVq2a3zGNqFGjhqKiohQXF6evvvpKffr00Zo1a0zHchg3Oj61atVy+e/PyZMn9eyzz2r58uUqVKiQ0SwMe3AAgYGBcnd3v+aKxtjYWJUuXdpQKsdStGhR3XnnnTp8+LBKly6tK1eu6MKFC5n2cdXjlfGZb/b9KV269DUXT169elXnz593yWMmSVWqVFFgYKAOHz4syXWO0eDBg/Xdd99p1apVKl++vH17dv5clS5d+rrfs4zXCoIbHZ/radSokSRl+g4V9OPj5eWlatWqqX79+ho9erRCQ0M1ceJEvj//daPjcz2u9v3Ztm2bzpw5o3r16snDw0MeHh5as2aNJk2aJA8PD5UqVSrfvkOUXwfg5eWl+vXra8WKFfZtaWlpWrFiRaaxQq4sISFBR44cUZkyZVS/fn15enpmOl4HDhzQiRMnXPJ4Va5cWaVLl850POLj47Vp0yb78YiIiNCFCxe0bds2+z4rV65UWlqa/T/Arub333/XuXPnVKZMGUkF/xhZlqXBgwdrwYIFWrlypSpXrpzp9ez8uYqIiNDu3bsz/SVh+fLl8vf3t//TrrPK6vhcT1RUlCRl+g4V1ONzI2lpaUpOTnb578+NZByf63G170+rVq20e/duRUVF2W8NGjRQjx497I/z7TuUG1fu4fZ9+eWXlre3tzVjxgzr119/tR5//HGraNGima5odCVDhw61Vq9ebR09etRav3691bp1ayswMNA6c+aMZVmW9cQTT1hBQUHWypUrra1bt1oRERFWRESE4dR55+LFi9aOHTusHTt2WJKs8ePHWzt27LCOHz9uWZZljRkzxipatKi1aNEia9euXVanTp2sypUrW5cuXbK/R7t27ay6detamzZtstatW2dVr17devTRR019pFx3s2N08eJFa9iwYdaGDRuso0ePWj/99JNVr149q3r16tbly5ft71GQj9GTTz5pBQQEWKtXr7aio6Ptt6SkJPs+Wf25unr1qlWnTh3rvvvus6KioqylS5daJUqUsEaMGGHiI+WqrI7P4cOHrTfeeMPaunWrdfToUWvRokVWlSpVrGbNmtnfoyAfH8uyrOHDh1tr1qyxjh49au3atcsaPny4ZbPZrGXLllmW5drfH8u6+fHh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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.sparse.linalg import cg\n",
"n = A.shape[0]\n",
"b = np.ones(n)\n",
"\n",
"\n",
"residuals = []\n",
"callback = lambda x: residuals.append(np.linalg.norm(A @ x - b))\n",
"x, _ = cg(A, b, callback=callback)\n",
"\n",
"residuals_preconditioned = []\n",
"callback = lambda x: residuals_preconditioned.append(np.linalg.norm(A @ x - b) / np.linalg.norm(b))\n",
"x, _ = cg(A, b, M=M, callback=callback)\n",
"\n",
"fig = plt.figure(figsize=(8, 8))\n",
"ax = fig.add_subplot(111)\n",
"ax.semilogy(residuals, 'k--')\n",
"ax.semilogy(residuals_preconditioned, 'b--')\n",
"ax.set_ylabel('relative residual')\n",
"fig.legend(['no preconditioning', 'SPAI'], loc='lower center', fancybox=True, shadow=True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q3dFyVTmR8GY"
},
"source": [
"# Preconditioners in High Performance Computing\n",
"\n",
"High Performance Computing (HPC) describes systems that have a number of distributed nodes (thousands to millions of cores) connected by a high speed network. Each node has its own memory bank and possibly multiple cores which share that memory.\n",
"\n",
"Effective usage of HPC requires a balance between distributed computing and the expense of inter-node communication.\n",
"\n",
"- Parallelized direct solver methods do exists (most modern implementations are) but they scale poorly with the number of nodes.\n",
"\n",
"- Iterative solvers parallelize better but require preconditioning for effective convergence. Since the preconditioner doesn't have to be a perfect inverse, there are strategies to distribute preconditioner computation with limited inter-node communication, which is then iterated to find the actual solution."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "odWKa-t4WTmH"
},
"source": [
"Let us now focus on solutions of differential equations over a given spatial domain, which is the most common area where these techniques are needed and encountered.\n",
"\n",
"Note - the following are geometric methods, which implies passing of information of the geometry to the solver."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uwVDQba7Vvkw"
},
"source": [
"##Domain decomposition"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C-OMAWt4VybL"
},
"source": [
"Domain decomposition methods are the most intuitive approach since they literally partition the full domain (geometry) into smaller chunks. Each chunk is assigned to a node (or subgroup) and solved locally.\n",
"\n",
"For example, a finite element representation of a plane wing, with colours denoting different *chunks*:"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IAjWVwdHXOVQ"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bZKVSmhoX2GJ"
},
"source": [
"A common approach is the *Addative Schwartz method* which defines *levels of overlap* between adjacent subdomains. The overlap enables the recombination of subdomains by passing information between subdomains.\n",
"\n",
"The nice thing about this is that we can do something like a direct solve on the subdomains which is great for black-box robustness! Since direct solvers scale $~O(n^3)$, this can be very effective although the cost of the global iterative scheme and the internode communication must be considered.\n",
"\n",
"These methods suffer with physics that propogates quickly throughout the domain. E.g.: Elasticity which is quasitstatic - a small displacement on one side must cascade through all the chunks."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KzZFXlRpZui4"
},
"source": [
"## Multigrid methods"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8OSuQYWAZxTQ"
},
"source": [
"Multigrid methods are a modern and tremendously powerful approach that can even achieve $O(n)$ scaling! The idea is to solve the differential equations on a *hierarchy of discretizations*."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ltddXRyceB83"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "k9XwY4A_eDqN"
},
"source": [
"The fine domain is the resolution that you actually want, but the course domain can be small enough to treat with a direct solver (for robustness). The equations are treated to a few iterations (Commmonly SOR) on each lower level before being passed along.\n",
"\n",
"The method naturally parallelizes; fine domains can be domain decomposed without overlap, because the communication is handled by the level above it.\n",
"\n",
"The full mathematical analysis actually shows this method is best considered in terms of Fourier space as each level reduces certain wavelengths of the residual. Elliptic problems (e.g.: elasticity) are especially well treated since information can be passed throughout the domain on the coarse level.\n",
"\n",
"- Geometric multigrid methods need to *know* about the geometry, not just the matrix.\n",
"- Algebraic multigrid methods can work completely on the matrix itself."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v9pIuCOv6LBJ"
},
"source": [
"#Multiphysics\n",
"\n",
"Typically, a certain types of physics (e.g.: parabolic / diffusive equations like heat and mass transport) will respond well to some, and other physics (e.g.elliptic / quasi-static equations like elasticity) will respond better to others. The question then is *how to combine them for a multiphysics equation?*\n",
"\n",
"Generally, each type of physics will have an associated field and vector of unknowns. E.g.: the temperature and concentration fields represented by $x_T$ and $x_c$ respectively. Linear system then adopts a block structure,\n",
"\n",
"$\\begin{bmatrix} A_{TT} & A_{Tc} \\\\ A_{cT} & A_{cc} \\end{bmatrix} \\begin{bmatrix} x_T \\\\ x_c \\end{bmatrix} = \\begin{bmatrix} b_T \\\\ b_c \\end{bmatrix}$\n",
"\n",
"where the diagonal of the $A$ matrix reflect the type of physics (heat / mass transport) and the cross-terms reflect couping (temperature dependent diffusivity / concentration dependent conductivity). These are sometimes called *operator split* methods, *physics-based preconditioners*, or *segregated solvers*.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kUYSCaUbhVtO"
},
"source": [
"Typically we have some ideas how to solve the diagonals, but how do we effectively precondition the block $A$ matrix? One option is using a *block Jacobi* method:\n",
"\n",
"\\begin{align}\n",
"P &= \\begin{bmatrix} A_{TT} & 0 \\\\ 0 & A_{cc} \\end{bmatrix} \\\\\n",
"P^{-1} &= \\begin{bmatrix} A^{-1}_{TT} & 0 \\\\ 0 & A^{-1}_{cc} \\end{bmatrix}\n",
"\\end{align}\n",
"\n",
"For a $2x2$ block system, we may use the *block Schur complement* method:\n",
"\n",
"$$\n",
"\\begin{bmatrix}\n",
"A & B \\\\\n",
"C & D\n",
"\\end{bmatrix}^{-1} =\n",
"\\begin{bmatrix}\n",
"A^{-1} + A^{-1}B(D - CA^{-1}B)^{-1}CA^{-1} & -A^{-1}B(D - CA^{-1}B)^{-1} \\\\\n",
"-(D - CA^{-1}B)^{-1}CA^{-1} & (D - CA^{-1}B)^{-1}\n",
"\\end{bmatrix}\n",
"$$\n",
"but this has a problematic $A^{-1}$ buried inside."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_aZJUB1LjOQs"
},
"source": [
"#Dr. Mike's tips\n",
"- Parallelized LU is still the go-to for most problems and should be your first approach.\n",
"- GMRES iteration is your next tool, but it needs preconditioning for effective use.\n",
"- If you are studying a well-known model, you can generally find good preconditioners in the literature. Use them!\n",
"- If not, most PDE solvers will have the ability to test different preconditioners and combine them hierarchically (COMSOL Multiphysics, PETSc*, etc).\n",
"- Addative Schwartz with LU on the subdomains is the most robust preconditioner I've found (aim for about n=10,000 per node).\n",
"- Geometric multigrid is finiky, but if you can get it working it is remarkable (Use it for elasticity!).\n",
"\n",
"\n",
"*Portable, Extensible Toolkit for Scientific Computation https://petsc.org/release/\n",
"\n"
]
}
],
"metadata": {
"colab": {
"authorship_tag": "ABX9TyNZgU+Pz+T4LyrhmEEyrLf6",
"include_colab_link": true,
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}